有啥技巧可以在 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 > 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 << "YES\n";
会更简单
我们不必立即给出“是”或“否”.. 我们必须为每个输入存储它并在最后显示所有内容.. 存储我们的答案是必要的..
@vaibhav:你呢?我想知道。规范没有这么说,这将是非常不正统的。所以我倾向于说不,你误解了规格。
我很确定你不会——只要你没有在你的答案之间输出其他东西(你不应该这样),它们就会按照期望的顺序出现规格。此外,您是否禁止使用 std::string 类型及其所有相关函数?这似乎更直接,尤其是对于这样一个更简单的问题。【参考方案3】:
你可以在不总结所有糖果的情况下回答这个问题。只需计算每个孩子堆的余数(小于 N)。这样,数字就不会变得太大而溢出。
我不会写出解决方案,因为这是一个竞赛问题,但如果您遇到困难,我可以提供更多提示。
【讨论】:
【参考方案4】:如果您的输入大于 unsigned long long,那么他们可能希望您为任意精度算术实现自定义函数(或者可以在不使用大整数的情况下解决问题)。如果输入适合最大的本机整数类型,但您的算法需要更大的整数,则最有可能考虑使用不同的算法。 :)
【讨论】:
鉴于赋值的简单性质,我觉得它会涉及任意精度的算术,这似乎很奇怪。 我并不是在回答这个具体问题。我想涵盖在此类编程竞赛问题中可能发生的所有情况。这个问题属于第二部分 => 使用不同的算法。【参考方案5】:如果您从 cin 读取,您只能读取适合某种整数变量的值。总和可能会溢出。
但是,您不必将数字相加。您可以将余数(除以N)相加,然后查看余数之和是否为N。
【讨论】:
以上是关于有啥技巧可以在 C++ 中处理非常大的输入吗?的主要内容,如果未能解决你的问题,请参考以下文章
有啥好的 C++ 项目构建工具可以替代 make 吗? [关闭]