• 【BZOJ】【1011】【HNOI2008】遥远的行星


    神奇的思路题QAQ


      玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解:

    就是因为不清楚如何应用那个答案误差不超过5%啦。

    从没见过这么诡异的题一下就懵了,问到了方法之后都还半信半疑,直到后来发现真的很有效果。

    就是小于2000的,我们n^2爆搞一下,大于两千的,由于α很小,i又大于2000,所以i-i×α挺大的,准确的说1/(i-1)与1/(i-i×α)差不多大……

    那么对于大于2000的i,假如他能弄到k,我们只要把公式中的i-j都变成i-k/2就可以了,误差不会很大。

    另外就是不能直接写(int)(a*i),因为当α=0.350000,i=20时给我算出来了个6……所以判一下

     1 /**************************************************************
     2     Problem: 1011
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:1652 ms
     7     Memory:3616 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 1011
    11 #include<cmath>
    12 #include<vector>
    13 #include<cstdio>
    14 #include<cstring>
    15 #include<cstdlib>
    16 #include<iostream>
    17 #include<algorithm>
    18 #define rep(i,n) for(int i=0;i<n;++i)
    19 #define F(i,j,n) for(int i=j;i<=n;++i)
    20 #define D(i,j,n) for(int i=j;i>=n;--i)
    21 #define pb push_back
    22 using namespace std;
    23 inline int getint(){
    24     int v=0,sign=1; char ch=getchar();
    25     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
    26     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
    27     return v*sign;
    28 }
    29 const int N=1e5+10,INF=~0u>>2;
    30 const double eps=1e-7;
    31 typedef long long LL;
    32 /******************tamplate*********************/
    33 int n;
    34 LL m[N],sum[N];
    35 double f[N],a;
    36 int main(){
    37 #ifndef ONLINE_JUDGE
    38     freopen("1011.in","r",stdin);
    39     freopen("1011.out","w",stdout);
    40 #endif
    41     scanf("%d%lf",&n,&a);
    42     F(i,1,n){
    43         scanf("%lld",&m[i]);
    44         sum[i]=sum[i-1]+m[i];
    45     }
    46     D(i,min(n,2000),1){
    47         int k=(int)(a*i);
    48         if (fabs( (double)(k+1)/a-i)<eps) k++;
    49         F(j,1,k) f[i]=f[i]+m[i]*m[j]/(double)(i-j);
    50     }
    51     F(i,2001,n){
    52         int k=(int)(a*i),mid=(1+k)>>1;
    53         f[i]=sum[k]*m[i]/(double)(i-mid);
    54     }
    55     F(i,1,n) printf("%lf
    ",f[i]);
    56     return 0;
    57 }
    View Code

    1011: [HNOI2008]遥远的行星

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
    Submit: 2302  Solved: 820
    [Submit][Status][Discuss]

    Description

    直 线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

    Input

    第一行两个整数N和A. 1<=N<=10^5.0.01< a < =0.35
    接下来N行输入N个行星的质量Mi,保证0<=Mi<=10^7

    Output

    N行,依次输出各行星的受力情况

    Sample Input

    5 0.3
    3
    5
    6
    2
    4

    Sample Output

    0.000000
    0.000000
    0.000000
    1.968750
    2.976000

    HINT

    精确结果应该为0 0 0 2 3,但样例输出的结果误差不超过5%,也算对

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    时光流年(4)向往
    Vue.js入门(9)组件插槽
    时光流年(3)古韵
    Java面试题(12)哈希表
    Java面试题(11)Java中hashCode方法的作用
    Java面试题(10)Java中==、equals()、compareTo()的区别
    Java MyBatis-Plus(1)
    Vue.js入门(8)watch、computed和methods之间的区别
    Java面试题(9)常用工具
    Java MyBatis3(11)逆向工程--MyBatis Generator
  • 原文地址:https://www.cnblogs.com/Tunix/p/4414866.html
Copyright © 2020-2023  润新知