2 条题解

  • 1
    @ 2023-10-27 7:40:43

    我们发扬人类智慧!

    首先我们注意到题目中有一句话:

    只要结果的相对误差不超过 5% 即可

    因此我们考虑分块,我们令块长 k=50k=50。然后用一个前缀和数组预处理出每一块内的质量和。

    分母的话我们就不要用 jij-i 了,我们可以用这一块的中点,这样我们就可以 O(1)O(1) 算出分母了,由于我们的块长不会很大,精度也可以保证。

    然后不满一块的部分我们直接暴力计算即可。

    时间复杂度:O(玄学)O(玄学)(话说人类智慧题都这个复杂度吧)。

    #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
      @ 2022-7-20 21:44:34
      #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
      上传者