2 条题解
-
1
我们发扬人类智慧!
首先我们注意到题目中有一句话:
只要结果的相对误差不超过 5% 即可
。因此我们考虑分块,我们令块长 。然后用一个前缀和数组预处理出每一块内的质量和。
分母的话我们就不要用 了,我们可以用这一块的中点,这样我们就可以 算出分母了,由于我们的块长不会很大,精度也可以保证。
然后不满一块的部分我们直接暴力计算即可。
时间复杂度:(话说人类智慧题都这个复杂度吧)。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; double m[N],sum[N],f[N]; int main(){ int n,k=50;double v; scanf("%d%lf",&n,&v); for(int i=1;i<=n;i++){ scanf("%lf",&m[i]); sum[i]=sum[i-1]+m[i]; } for(int j=1;j<=n;j++){ for(int i=1;i<=(int)(v*j/k);i++){ f[j]=f[j]+m[j]*(sum[i*k]-sum[(i-1)*k])/(j-((i-1)*k+1+i*k)/2.0); } for(int i=(int)(v*j/k)*k+1;i<=v*j;i++){ f[j]=f[j]+m[i]*m[j]/(j-i); } } for(int i=1;i<=n;i++){ printf("%.6lf\n",f[i]); } return 0; }
-
0
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res; } const double eps = 1e-8; const int N = 1e5 + 5; int n; double a, m[N], res[N], sum[N]; int main() { int i, j; n = read(); scanf("%lf", &a); for (i = 1; i <= n; i++) sum[i] = sum[i - 1] + (m[i] = read()); for (i = 1; i <= n; i++) { int x = 1.0 * i * a + eps; if (!x) continue; if (x <= 100) for (j = 1; j <= x; j++) res[i] += m[i] * m[j] / (i - j); else { int tx = 1, ty, tz = x / 100, ta = x % 100; for (j = 1; j <= 100; j++) { ty = tx + tz - (j > ta); res[i] += (sum[ty] - sum[tx - 1]) * m[i] / (i - (tx + ty) / 2); tx = ty + 1; } } } for (i = 1; i <= n; i++) printf("%.6lf\n", res[i]); return 0; }
- 1
信息
- ID
- 1011
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 35
- 已通过
- 17
- 上传者