问题 G: 糖果
时间限制: 1.000 Sec 内存限制: 128 MB
题目描述
有n个小朋友,有m袋糖果,第i袋的糖果数量是a[i]。已知n<=m<2n。每个小朋友至少要有一袋糖果,至多只能要两袋糖果。分配的目标是把这m袋糖果全部分完,而且要使得每个小朋友最终得到的糖果数量都是相等的。如果可以做到则输出”possible”,如果做不到则输出”impossible”。注意:不能拆开一个袋子的糖果,必须整袋整袋的分配。
输入
第一行,一个正整数R,表示有R组测试数据。1<=R<=10。
每组测试数据的格式是:
第一行,两个整数n和m。1<=n<=50。n<=m<2n。
第二行,m个整数,第i个整数是a[i]。1<=a[i]<=1000。
输出
共R行,每行一个字符串,”possible”或者”impossible”,双引号不用输出。
样例输入
4 1 1 47 3 5 10 8 10 1 1 3 5 3 9 10 7 1 6 11 1 1 1 2 1 1 1 1 1 1 1
样例输出
possible impossible possible possible
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int w;
cin >> w;
while (w--) {
int peo, n, peo_n[55]{}, candy[110], i, t;
cin >> peo >> n;
if (peo > n || n > 2 * peo)
{
cout << "impossible";
continue;
}
for (i = 0; i < n; i++)
{
cin >> candy[i];
}
sort(candy, candy + n);
for (i = n - 1; i >= n - peo; i--)
{
peo_n[n - i - 1] = peo_n[n - i - 1] + candy[i];
}
if (n > peo)
{
for (i = n - peo; i > 0; i--)
{
peo_n[i] += candy[i - 1];
}
}
int temp = peo_n[0];
bool qq = 0;
for (i = 1; i < peo; i++)
{
if (temp != peo_n[i])
{
qq = 1;
}
}
if (qq == 1)
cout << "impossible";
else
cout << "possible";
cout << endl;
}
return 0;
}