在C ++中处理非常大的输入有什么技巧吗?

时间:2009-10-16 13:49:18

标签: c++

  

上课去了学校。并且,通常情况下,所有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;
}

5 个答案:

答案 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.

相关问题