省流:想请教一下,遇到求和题(枚举题)时需要什么操作才能避免超时呢?
具体事情是这样的:
今天尝试参加月赛,但第一道签到题就给我难住了。
题面是这样的
出题人的题解也说是暴力枚举就行,但我自己写下来总会超时
第一个版本写的时候我就感觉会超时,结果确实
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
long long n,sum,s,temp;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> s;
sum = 0;
for (int k = 1; k <= s; k++)
{
temp = sqrt((k + 514) / 114);
sum += ceil(temp);
}
cout << sum << endl;
}
}
又写了第二个版本,还是超时
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
long long n,sum, s, temp,sum1[1000000],v[10000];
int t = 10000;
int t1 = 2;
int main()
{
cin >> n;
sum1[0] = 2;
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
for (int i = 2; i < 1000000; i++)
{
temp = sqrt((i + 514) / 114);
sum1[i] = sum1[i-1] + ceil(temp);
}
for (int i = 0; i < n; i++)
{
cout << sum1[v[i]]+2<<endl;
}
}
因为看到样例中有很大的数据想着用空间换时间,但是要么报错数组太大,要么提交run time limited
又陆续写了vector的版本结果超容量了。
原题呢,做题之前先审题,到底有几个输入
如果题目只要求输入一次,你这反复要求输入不超时怎的