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

Time Limit Exceeded - Simple Program - Divisibility Test

本文关键字:程序 可分割 测试 简单 时间 过时      更新时间:2023-10-16

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

输出写一个整数输出,表示有多少整数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)原因如下:超过时限。如何进一步优化?

正如caleb所说,该问题被标记为"巨大的输入测试",因此需要使用一些更好/更快的I/O方法

printf替换cout,用scanfcin将给你一个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;
}

链接的问题包含以下描述:

这个问题的目的是验证你的方法使用读取输入数据的速度足以处理问题印有巨大的输入/输出警告。你应该是能够在运行时每秒处理至少2.5MB的输入数据。

考虑到这一点,使用iostreams一次从输入中读取几个字节的值不会减少。我在谷歌上搜索了一下,发现了CodeChef上描述的cincout的替代品。您可以尝试的其他一些方法包括使用内存映射文件和stdio。

这也可能有助于寻找优化计算的方法。例如,如果ti<k、 那么你知道k不是ti的因子。根据k的大小和ti值的分布,单独进行观测可以节省大量时间。

请记住:您的代码并不意味着它