输入 输入以两个正整数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)接受,原因如下:超出时间限制。如何进一步优化?
答案 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 值的分布,单独观察可以节省大量时间。
请记住:您的代码简短这一事实并不代表 。