http://acm.hdu.edu.cn/showproblem.php?pid=5933
给一串数,需要经过最少次数的操作,使得最终得到k个相同的数,每次操作可以将2个数合并或者将一个数拆成2个。模拟即可,从第一个数开始,如果该数大于目标值,就不断减掉目标值,将剩下的加到下一项上去,再注意其中操作次数的变化即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
int cs=1;
while(t--)
{
int n,k;
cin>>n>>k;
int a[111111];
int i;
long long int sum=0;
for( i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum%k!=0)
{
cout<<"Case #"<<cs++<<": "<<"-1"<<endl;
continue;
}
long long int K=sum/k;
long long int ans=a[1];
long long int tim=0;
for( i=2;i<=n;i++)
{
while(ans>=K)
{
tim++;
ans-=K;
}
if(ans==0){
tim--;
ans=a[i];
}
else
{
tim++;
ans+=a[i];
}
}
while(ans>K)tim++,ans-=K;
cout<<"Case #"<<cs++<<": "<<tim<<endl;
}
return 0;
}