题意:
给你n个数,你有两个操作:
1.将相邻两个数合并 2.将一个数拆分成两个数
将这n个数变成k个数,要求操作数最小。
如果前缀和pre[x],pre[y]已经是x的倍数 此时若把pre[x],pre[y]-pre[x-1]合并成一块,则最后也是要分开变成pre[x],pre[y]-pre[x-1],多了两步
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
typedef long long ll;
const int N=2e5+20;
ll a[N],pre[N];
int main()
{
int t;
cin>>t;
for(int cas=1;cas<=t;cas++)
{
int n,k;
cin>>n>>k;
pre[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
pre[i]=a[i]+pre[i-1];
}
if(pre[n]%k!=0)
printf("Case #%d: -1\n",cas);
else
{
ll x=pre[n]/k;//每一块的个数
ll cnt=0;
for(int i=1;i<n;i++)
{
if(pre[i]%x==0)
cnt+=2;
}
ll ans=n-1+k-1-cnt;
printf("Case #%d: %I64d\n",cas,ans);
}
}
return 0;
}