超出时间限制 - 简单程序 - 可分性测试

时间:2014-04-14 05:33:01

标签: c++ cin

输入 输入以两个正整数n k(n,k <= 10 ^ 7)开始。接下来的n行输入包含一个正整数ti,每个不大于10 ^ 9。

输出 写一个整数来输出,表示有多少整数ti可被k整除。

示例

输入:

7 3
1
51
966369
7
9
999996
11

输出:

4

我的代码:

#include <iostream>
using namespace std;

int main()
{


long long n,k, i;
cin>>n;
cin>>k;
int count=0;
for(i=0;i<n;i++)
{
    int z;
    cin>>z;
    if(z%k == 0) count++;
}
cout<<count;

return 0;
}

现在此代码生成正确的输出。但是,它不被CodeChef(http://www.codechef.com/problems/INTEST)接受,原因如下:超出时间限制。如何进一步优化?

2 个答案:

答案 0 :(得分:2)

正如caleb所说,问题被标记为&#34; 极大的输入测试&#34;所以它要求你使用一些更好/更快的I / O方法

printf 替换 cout ,用 scanf 替换 cin 将为您提供AC,但可以改善您的执行你需要使用一些更快的IO方法,例如使用getchar_unlocked()逐个字符读取将为你提供更好的执行时间

因此您可以使用这样的函数读取值,以获得更好的执行时间。

 inline int read(){
    char c=getchar_unlocked();
    int n=0;
    while(!(c>='0' && c<='9'))
     c=getchar_unlocked();
    while(c>='0' && c<='9'){
     n=n*10 + (c-'0');
    c=getchar_unlocked();
}
return n;
}

答案 1 :(得分:1)

链接问题包含以下说明:

  

此问题的目的是验证您的方法是否正确   用于读取输入数据足以快速处理问题   标有巨大的输入/输出警告。你应该是   能够在运行时每秒处理至少2.5MB的输入数据。

考虑到这一点,使用iostreams一次从输入读取几个字节的值并不会削减它。我用Google搜索了一下,发现a drop-in replacement for cin and cout described on CodeChef。您可以尝试的其他一些方法包括使用memory-mapped file和使用stdio。

它也可能有助于寻找优化计算的方法。例如,如果t i &lt; k,那么你知道k不是t i 的因子。根据k的大小和t i 值的分布,单独观察可以节省大量时间。

请记住:您的代码简短这一事实并不代表