• 1011: [HNOI2008]遥远的行星


    1011: [HNOI2008]遥远的行星

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
    Submit: 2241  Solved: 793
    [Submit][Status]

    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

     题解:呵呵呵呵呵。。。感觉自己真心捉鸡——
    从来就只知道只有物理竞赛化学竞赛里面会用近似处理,没想到这里也近似。
    大致思路就是先进行分段处理,然后小的部分暴力,大的部分近似处理,有效的利用了题目中所给的误差不超过5%呵呵哒^_^
    接下来开始引用(感觉省选现场能A掉此题的都是神OTL,这个近似真心略诡异啊)

    设f[i]为第i个行星受到的引力,g[i]表示第i个行星所受引力的最后来源行星

    HNOI2008】遥远

    【BZOJ1011

    然后小范围(我是取 α * i < 9)暴力搞,大范围就乱搞,忽略除数(i - j)的差距

     1 /**************************************************************
     2     Problem: 1011
     3     User: HansBug
     4     Language: Pascal
     5     Result: Accepted
     6     Time:2296 ms
     7     Memory:1984 kb
     8 ****************************************************************/
     9  
    10 const st=50;
    11 var
    12     i,j,k,l,m,n:longint;  
    13     p:extended;
    14     b,c:array[0..100010] of longint;
    15     a:array[0..100010] of extended;
    16 begin
    17     readln(n,p);
    18     for i:=1 to n do read(b[i]);
    19     readln;
    20     for i:=1 to n do c[i]:=trunc(i*p);
    21     for i:=1 to n do
    22         begin
    23             if a[i]<>0 then a[i]:=0;
    24             if c[i]<>0 then
    25                 begin
    26                     if i<=st then
    27                         begin
    28                             for j:=1 to c[i] do a[i]:=a[i]+b[j]/(i-j);
    29                             a[i]:=a[i]*b[i];
    30                         end
    31                     else
    32                         begin
    33                             a[i]:=(a[i-st]/b[i-st])*((i-st-(c[i-st]/2))/(i-(c[i-st]/2)));
    34                             for j:=c[i-st]+1 to c[i] do a[i]:=a[i]+b[j]/(i-j);
    35                             a[i]:=a[i]*b[i];
    36                         end;
    37                 end;
    38         end;
    39     for i:=1 to n do writeln(a[i]:0:6);
    40     readln;
    41 end.
  • 相关阅读:
    初级工程师该如何去学习,如何去研发开关电源?
    CentOS-pam认证机制简介
    Linux-密码复杂度限制
    如何写一个简单的webserver(一):最简实现
    MySQL5.6绿色版安装(mysql-5.6.24-winx64.zip)
    Linux忘记roo密码的解决办法
    Linux中的netstat命令详解
    WireShark抓包分析(二)
    Wireshark抓取TCP包分析
    Wireshark 基本介绍和学习 TCP 三次握手
  • 原文地址:https://www.cnblogs.com/HansBug/p/4311857.html
Copyright © 2020-2023  润新知