上课去了学校。并且,通常情况下,所有N个孩子的背包都塞满了糖果。但很快就发生了争吵,因为有些孩子的糖果比其他孩子多。很快,老师意识到他必须介入:“每个人,听着!把你在这张桌子上的所有糖果放在这里!”
很快,老师的桌子上堆满了很多糖果。 “现在,我将把糖果分成N个等分堆,每个人都会得到其中一个。”宣布老师。“等等,这真的有可能吗?”想知道一些聪明的孩子。
问题规范
您将获得每个孩子带来的糖果数量。找出老师是否可以将糖果分成N个完全相等的堆。 (为了完成这项任务,所有糖果都属于同一类型。)
输入规范
输入文件的第一行包含一个指定测试用例数的整数T.每个测试用例前面都有一个空行。
每个测试用例如下所示:第一行包含N:子项数。接下来的N行中的每一行都包含一个孩子带来的糖果数量。
输出规格
对于每个测试用例,如果糖果可以平均分配,则输出单行“YES”,否则输出“NO”。
实施例
输入:
2 5 5 2 7 3 8 6 7 11 2 7 3 4
输出:
YES NO
问题很简单,但案例是SPOJ评委使用非常大的输入。我使用unsigned long long
作为数据类型,但它显示了wc ..
这是我的代码:
#include<iostream>
using namespace std;
int main()
{
unsigned long long c=0,n,k,j,testcases,sum=0,i;
char b[10000][10];
cin>>testcases;
while(testcases-->0)
{
sum=0;
cin>>n;
j=n;
while(j-->0)
{
cin>>k;
sum+=k;
}
if(sum%n==0)
{
b[c][0]='Y';b[c][1]='E';b[c][2]='S';b[c][3]='\0';
c++;
}
else
{
b[c][0]='N';b[c][1]='O';b[c][2]='\0';
c++;
}
}
for(i=0;i<c;i++)
cout<<"\n"<<b[i];
return 0;
}
答案 0 :(得分:4)
易。不要加糖果的数量。相反,保持一个孩子的数量,每个孩子的糖果数量。 (CCK
),以及额外的糖果数量CEC
。当您阅读新行时,CK += 1; CEC += newCandies; if (CEC > CK) CCK += (CEC / CK); CEC %= CK;
答案 1 :(得分:3)
这样的一行不关心你吗?
b[c][0]='Y';b[c][1]='E';b[c][2]='S';b[c][3]='\0';
写起来不是更简单吗?
strcpy(b[c], "YES");
答案 2 :(得分:3)
你可以在不总结所有糖果的情况下做这个问题。只计算每个子堆的余数(小于N)。这样,数字就不会变得太大而且溢出。
我不会写出一个解决方案,因为这是一个竞赛问题,但如果你遇到困难我可以提供更多提示。
答案 3 :(得分:1)
如果你的输入大于unsigned long long,那么他们可能希望你为任意精度算术实现自定义函数(或者可以在不使用大整数的情况下解决问题)。如果输入符合最大的本机整数类型,但您的算法需要更大的整数,则最有可能考虑使用不同的算法。 :)
答案 4 :(得分:0)
如果您正在读取cin,则只能读取适合某种整数变量的值。总和可能会溢出。
但是,您不必添加数字。你可以添加剩余部分(从N除以),然后查看剩余部分的总和是否为N.