Harmonic Number LightOJ - 1234

原题链接

考察:打表+思维

直接开1e8的数组预处理会MLE.

所以需要压缩打表.每100存储一次.

预处理的时候看大佬有更好的方法,eg:用一个变量接收1~99之间的和,到%100==0时再赋值给数组

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5 const double ebp = 1e-12;
 6 const int M = 1e8+10;
 7 typedef long long ll;
 8 double ans[M/100+10];
 9 void inits()
10 {
11     for(int i=1;i<=M;i++)
12     {
13         if(i%100==0)
14         {
15             ans[i/100] +=1.0/i;
16             ans[i/100+1]+=ans[i/100];
17         }else ans[i/100+1] += 1.0/i;    
18     }
19 }
20 int main()
21 {
22     inits();
23     int T,kcase = 0;
24     scanf("%d",&T);
25     while(T--)
26     {
27         int n; scanf("%d",&n);
28         int b = n/100;
29         double res = ans[b];
30         for(int i=b*100+1;i<=n;i++)
31             res+=1.0/i;
32         res+=ebp;
33         printf("Case %d: %.10lf\n",++kcase,res);
34     }
35     return 0;
36 }

 

posted @ 2021-01-26 22:06  acmloser  阅读(50)  评论(0编辑  收藏  举报