校oj1376-划分办公室区域

划分办公区域

Time Limit:1000MS  Memory Limit:65536K
Total Submit:469 Accepted:150

Description

有n块连续的办公区域,每块办公区域能容纳的人数分别为a1,a2,a3,a4...an,现在boss下令,要求把这些办公区域重新划分为k块,且每块办公区域能容纳的数量相同。 
已知将一块办公区域拆分成两块办公区域或者把两块办公区域合并成一块办公区域需要消耗1点材料,问完成目标所需要的最少材料是多少? 若无法完成,输出-1. 

Input

输入数据的第一行有一个整数T,表示有T组测试数据。 
每组数据的第一行有两个整数n,k (0 < n,k < 1000) 
接下来一行有n个整数,表示 a1,a2,a3...an(0 < ai < 1000)。 

Output

输出一个整数,表示需要消耗的最少材料,如果不能完成,输出-1. 
每组测试数据输出一行。 

Sample Input

 

2
2 3
4 6
3 4
1 2 1

 

Sample Output

 

-1
1

 

Source

#include <iostream>
#include <cstdio>
using namespace std;
int a[1005];

int main()
{
    int n,k,sum,cnt;
	int T;
    int i;
    scanf("%d",&T);
    while(T--)
    {
        
        sum = 0;
        cnt = 0;
        scanf("%d%d",&n,&k);
        for(i = 0; i < n; i++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        if(sum % k == 0)
        {
            int ave = sum/k; //每份
                i =0;
                while(i!=n)//一个一个元素处理
                {
					while(a[i]>ave)//例如将a[i]=20 ave=3
									//处理后为2
					{
						a[i]-=ave;
						cnt++;
					}
                    while(a[i]<ave)//再处理
                    {
						a[i] +=a[i+1];//合并后一位
						a[i+1] =a[i];
						cnt++;
						i++;         //后一位跳过
					}					
					
					if(a[i] == ave)//相等时直接跳过
					{
						i++;
					}
					
                }
            
            printf("%d\n",cnt);

        }
        else
        {
            printf("-1\n");

        }

    }

    return 0;
}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值