有啥技巧可以在 C++ 中处理非常大的输入吗?

Posted

技术标签:

【中文标题】有啥技巧可以在 C++ 中处理非常大的输入吗?【英文标题】:Is there any trick to handle very very large inputs in C++?有什么技巧可以在 C++ 中处理非常大的输入吗? 【发布时间】:2009-10-16 13:49:18 【问题描述】:

一个班级去学校旅行。而且,像往常一样,所有 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;

【问题讨论】:

您是如何使用 unsigned long long 实现的? 在文件大小的情况下大还是在数据类型的情况下大? @vaibhav- 输入的是文件还是 cin 语句? 大是输入..它们不包括文件..我们必须从用户那里获取输入.. 那些是幸运的孩子... 10^64 颗糖果! 【参考方案1】:

简单。不要把糖果的数量加起来。取而代之的是,计算孩子的数量,每个孩子的糖果数量。 (CCK),还有一些额外的糖果 (CEC。当你读到新的一行时,CK += 1; CEC += newCandies; if (CEC &gt; CK) CCK += (CEC / CK); CEC %= CK;

【讨论】:

我认为您不需要计算每个孩子的糖果数量(这可能是另一个溢出来源)。在每个孩子之后保持“额外”糖果的数量就足够了。 ck,cec 的数据类型应该是什么?应该是 unsigned long long 吗? 不管它需要什么,真的。不过,如果它与 unsigned int 一起使用,我不会感到惊讶。 其实每个孩子的糖果数量是平均的。因此,它永远不会大于最大的单一贡献。所以,如果没有孩子带的糖果超过UINT_MAX,那么平均也会少于UINT_MAX【参考方案2】:

这样的台词你不关心吗?

b[c][0]='Y';b[c][1]='E';b[c][2]='S';b[c][3]='\0';

写起来会不会更简单??

strcpy(b[c], "YES");

【讨论】:

直接输出字符串不是更简单吗?只有两种选择... cout &lt;&lt; "YES\n";会更简单 我们不必立即给出“是”或“否”.. 我们必须为每个输入存储它并在最后显示所有内容.. 存储我们的答案是必要的.. @vaibhav:你呢?我想知道。规范没有这么说,这将是非常不正统的。所以我倾向于说不,你误解了规格。 我很确定你不会——只要你没有在你的答案之间输出其他东西(你不应该这样),它们就会按照期望的顺序出现规格。此外,您是否禁止使用 std::string 类型及其所有相关函数?这似乎更直接,尤其是对于这样一个更简单的问题。【参考方案3】:

你可以在不总结所有糖果的情况下回答这个问题。只需计算每个孩子堆的余数(小于 N)。这样,数字就不会变得太大而溢出。

我不会写出解决方案,因为这是一个竞赛问题,但如果您遇到困难,我可以提供更多提示。

【讨论】:

【参考方案4】:

如果您的输入大于 unsigned long long,那么他们可能希望您为任意精度算术实现自定义函数(或者可以在不使用大整数的情况下解决问题)。如果输入适合最大的本机整数类型,但您的算法需要更大的整数,则最有可能考虑使用不同的算法。 :)

【讨论】:

鉴于赋值的简单性质,我觉得它会涉及任意精度的算术,这似乎很奇怪。 我并不是在回答这个具体问题。我想涵盖在此类编程竞赛问题中可能发生的所有情况。这个问题属于第二部分 => 使用不同的算法。【参考方案5】:

如果您从 cin 读取,您只能读取适合某种整数变量的值。总和可能会溢出。

但是,您不必将数字相加。您可以将余数(除以N)相加,然后查看余数之和是否为N。

【讨论】:

以上是关于有啥技巧可以在 C++ 中处理非常大的输入吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥好的 C++ 项目构建工具可以替代 make 吗? [关闭]

c 和 c++ 中的指针之间有啥大的区别吗? [关闭]

找到丢失的 jQuery 对象有啥技巧吗?

即使在迁移时设置了默认值,批量分配也不会处理 Null 输入。对此有啥解决方案吗?

我的带有 Rcpp::List 输入的 C++ 函数非常慢

用sublime text 3写C++程序有啥好用的插件或者技巧吗?