【问题标题】: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 颗糖果!

标签: c++


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2013-10-27
      • 2022-12-06
      • 1970-01-01
      • 2017-05-19
      相关资源
      最近更新 更多