HDU 5933(模拟)
题意:
有n个数,对于这n个数,每次只能执行下面两种操作其中的一种:
一:将相邻的两个数相加合并成一个数,
二:将一个数分成相邻的两个数,这两个数的和仍然等于之前的数
请问至少需要多少次操作才能将这n个数变成k个相等的数。
思路:
顺着模拟,处理f>kk时比较巧妙。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int main()
{
int t,n,k,cas=0;
cin>>t;
while(t--)
{
cin>>n>>k;
deque<ll> dq;
ll sum=0;
for(int i=0;i<n;i++)
{
ll a;
scanf("%lld",&a);
dq.push_back(a);
sum+=a;
}
cout<<"Case #"<<++cas<<": ";
if(sum%k)
{
cout<<-1<<endl;
continue;
}
ll ans=0;
ll kk=sum/k;
while(!dq.empty())
{
ll f=dq.front();
dq.pop_front();
if(f==kk)
{
continue;
}
if(f>kk)
{
ans+=f/kk;
if((f%kk)==0)
{
ans--;
}
else
{
dq.push_front(f%kk);
}
}
if(f<kk)
{
ll t=dq.front();
dq.pop_front();
dq.push_front(f+t);
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}