原题
最近DH 接手了一个项目组,这个项目组分为 N 个小组,第 i 个小组有 ai 人,但他觉得这个分组方式不合理,想要换一种分组方式。DH的分组方式是把所有人平均分为 K 组,但他也不想搞得太麻烦,就决定在重新分组时,只采取下面两种操作方法:
1、把两个相邻组合成一组,新组人数为原两组之和;
2、把一组拆成相邻的两组,两组人数可以随意设置,但总人数要等于原来那一组的人数。
问DH最少需要进行多少次操作才可以完成重新分组?
输入
第一行两个整数 N , K ( 1≤N,K≤100000 )
第二行 N 个整数, a1 , a2 , ... , an ( 1≤ai≤100000 )
输出
如果可以DH可以完成分组,输出最少操作次数,否则输出 −1
解析
若总人数无法均分为k组,直接输出-1;反之,求出平均值作为每组标准人数,
对每组人数a[i]分类讨论:
1.人数小于平均值,将这组人加到下一组中,操作数加一。
2.人数大于等于平均值但不均分,将余数人数加到下一组,操作数相应增加。
3.人数大于等于平均值且均分,将该组人数均分,操作数相应增加即可。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100007];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
long long sum = 0;
for(int i = 0;i < n;i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
long long ave = sum/k;
int step = 0;
if(sum%k)
{
printf("-1\n");
}
else
{
for(int i = 0;i < n;i++)
{
if(a[i] < ave)
{
a[i+1] += a[i];
step++;
}
else
{
if(a[i] % ave)
{
a[i+1] += a[i]%ave;
step += a[i]/ave + 1;
}
else
{
step += a[i]/ave -1;
}
}
}
printf("%d\n",step);
}
}