校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;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章