Problem Description ArcSoft, Inc. is a leading global professional computer photography and computer vision technology company. Input First line contains an integer T , which indicates the number of test cases. Output For every test case, you should output 'Case #x: y', where x indicates the case number and counts from 1 and y is the minimum operations. Sample Input 3 1 3 14 3 1 2 3 4 3 6 1 2 3 Sample Output Case #1: -1 Case #2: 2 Case #3: 3 |
题意:给你 n 个数 让你经过 差分(任意差分) 结合 (相邻两个相加)
然后自己手推一下 就可以得到以下结论
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
//#include <map>
#include<vector>
#define ll long long
using namespace std;
#define pai acos(-1,0)
ll a[100010];
int main()
{
int t;
scanf("%d",&t);
int z=1;
while(t--)
{
int n,m;
cin>>n>>m;
ll s=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s+=a[i];
}
if(s%m)
{
printf("Case #%d: -1\n",z++);
continue;
}
if(m==1)
{
printf("Case #%d: %d\n",z++,n-1);
continue;
}
ll x=s/m;
ll cnt=0;
for(int i=1;i<=n;i++)
{
if(a[i]>=x&&a[i]%x==0)
{
cnt+=a[i]/x-1;
}
else
{
a[i+1]+=a[i];
cnt++;
}
}
printf("Case #%d: %lld\n",z++,cnt);
}
return 0;
}