HDU 5933 ArcSoft's Office Rearrangement(模拟)

来源:互联网 发布:梵高传 知乎 编辑:程序博客网 时间:2024/06/18 10:58

题意:对于给定的n个数,可以把它们分割或合并,要求最后变成k个大小相等的数,求操作次数

把每个数想像成一个长度的线段,这条线段的总长度为ni=1ai,实际上就是把这条线段分成k个相等的部分
设k段的每一部分为aver
那进行k个循环:
不断的给sum加上a[i];
如果sum < aver,说明要进行一次合并操作,ans++;
当不满足sum < aver时,则停止加a[i];
此时,如果sum > aver,并且说明需要一次分割操作,ans++,将sum变为分割后剩余的部分;

如果sum值在合并操作时刚好变成了aver,说明最后的时候多了一次合并,ans–;
注意longlong,以及……不要想太复杂qaq

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=100010;typedef long long ll;ll n,k,ans;ll a[N];int main(){    int t,cas=1;    scanf("%d",&t);    while(t--){        ans=0;        ll sum=0;        scanf("%lld %lld",&n,&k);        for(int i=1;i<=n;i++){            scanf("%lld",&a[i]);            sum+=a[i];        }        if(sum%k){            ans=-1;        }        else{            ll aver=sum/k;            int j=1;            sum=0;            for(int i=1;i<=k;i++){                while(sum<aver){                    sum+=a[j];                    j++;                    ans++;                }                if(sum>aver) ans++;                sum=sum-aver;                if(sum==0) ans--;            }        }        printf("Case #%d: %lld\n",cas++,ans);    }}/*33 12 3 43 61 2 3*/
0 0
原创粉丝点击