超时

P1035 [NOIP2002 普及组] 级数求和

Jayden_316 @ 2023-10-09 21:35:03

60分,时间复杂度太高,达到了O(n ^ 2),n表示 求解得数 ,超时代码:

#include<iostream>

using namespace std;
int k, n = 1;
float sum;

int main(){

    cin >> k;

    while(sum <= k){
        n++;
        sum = 0;
        for(int i = 1; i <= n; i++) sum += 1.0 / i;
    }

    cout << n;

    return 0;
}

不知道如何简化双重循环,多指教。


by zhouzihang3 @ 2023-10-09 21:39:24

cin>>k;
for(i=1;n<=k;i++) n+=1.0/i;
cout<<i-1;

可以将for循环条件换成另外一个数到达某个条件,如上,于是就可以通过当前加起来的总和与输入的数比较即可


by wangjiawen @ 2023-10-09 21:40:08

@Jayden_316

就用一个while就行啊

#include<iostream>
using namespace std;
long long n,ans;
double m;
int main()
{
    cin>>n;
    while(m<=n)
    {
        ans++;
        m=m+1.0/ans;
    }
    cout<<ans;
    return 0;
}

by zhouzihang3 @ 2023-10-09 21:42:24

@wangjiawen n和ans无需开long long,数据很小,打表都能过


by wangjiawen @ 2023-10-09 21:44:03

@zero_egg 额,我习惯了开long long除非被卡ML,我一般不改为int。


by zhouzihang3 @ 2023-10-09 21:51:35

烦@wangjiawen 上周上课的时候改的清奇缺省源

#define L int
#define int long long
#define returnO_o return 0
#difine mian main

真6,**滥用标题行特判


by wangjiawen @ 2023-10-09 21:55:43

@zero_egg 9


|