Codeforces Round #559

    xiaoxiao2022-07-14  160

    A.有加才减

    //A #include <bits/stdc++.h> using namespace std; int main() { int n; string s; cin>>n; cin>>s; int ad = 0,sub = 0; for(int i=0;i<s.size();i++){ if(s[i]=='+'){ ad++; }else { if(ad>0){ ad--; } } } printf("%d\n",ad); return 0; }

    B.

    //B #include <bits/stdc++.h> using namespace std; int mi = 1e9+1; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ int t; scanf("%d",&t); mi = min(mi, t/max(i-1,n-i)); } printf("%d\n",mi); return 0; }

    C.

    n个男生给m个女生每人都送糖果,

    接下来n个数a1~an是男生送出的最小数量,然后是m个 b1~bm 是女生收到的最大数量。

    问最少多少糖果。

    解:

        先假设男生送给女生每个人都是最小的,则ans = sum(a1~an)*m.

    再补偿差距  = bj  -  ai.   补偿尽可能少,bj是不变的,ai就尽可能大。将n个数排序,从最大的a1开始每个可以补偿m-1次。

    因为要保证本身最小为ai。

      若有bj<amax,则输出-1

    //559 C #include <bits/stdc++.h> using namespace std; #define ll long long const int N = 1000005; ll n,m; ll a[N],b[N]; int cmp(int c,int d){ return c>d; } int main() { ll ans = 0; ll sum = 0; int flag = 0; cin>>n>>m; for(int i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } ans = sum*m; sort(a,a+n,cmp); int j = 0; int count = m-1; for(int i =0;i<m;i++){ cin>>b[i]; if(b[i]>a[0]){ ans+=b[i]-a[j]; count--; if(count==0){ j++; count = m-1; } }else if(b[i]<a[0]){ flag = 1; } } if(flag)printf("-1\n"); else printf("%I64d\n",ans); return 0; }

     

    最新回复(0)