简单分组

原题

最近DH 接手了一个项目组,这个项目组分为 N 个小组,第 i 个小组有 ai 人,但他觉得这个分组方式不合理,想要换一种分组方式。DH的分组方式是把所有人平均分为 K 组,但他也不想搞得太麻烦,就决定在重新分组时,只采取下面两种操作方法:

1、把两个相邻组合成一组,新组人数为原两组之和;

2、把一组拆成相邻的两组,两组人数可以随意设置,但总人数要等于原来那一组的人数。

问DH最少需要进行多少次操作才可以完成重新分组?

输入

第一行两个整数 N K 1NK100000

第二行 N 个整数, a1 , a2 , ... , an 1ai100000

输出

如果可以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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值