求和枚举题如何不超时,不超容?

省流:想请教一下,遇到求和题(枚举题)时需要什么操作才能避免超时呢?
具体事情是这样的:
今天尝试参加月赛,但第一道签到题就给我难住了。
题面是这样的

img

出题人的题解也说是暴力枚举就行,但我自己写下来总会超时

第一个版本写的时候我就感觉会超时,结果确实

#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

img

又陆续写了vector的版本结果超容量了。

原题呢,做题之前先审题,到底有几个输入
如果题目只要求输入一次,你这反复要求输入不超时怎的