HNOI2008 遙遠的行星

2022-05-10 23:51:07 字數 1450 閱讀 9726

直線上n顆行星,x=i處有行星i,行星j受到行星i的作用力,當且僅當i<=aj.此時j受到作用力的大小為 fi->j=mi*mj/(j-i) 其中a為很小的常量,故直觀上說每顆行星都只受到距離遙遠的行星的作用。請計算每顆行星的受力,只要結果的相對誤差不超過5%即可.

輸入格式:

第一行兩個整數n和a. 1<=n<=10^5.0.01< a < =0.35,接下來n行輸入n個行星的質量mi,保證0<=mi<=10^7

輸出格式:

n行,依次輸出各行星的受力情況

輸入樣例#1:複製

5 0.335

624

輸出樣例#1:複製

0.000000

0.000000

0.000000

1.968750

2.976000

精確結果應該為0 0 0 2 3,但樣例輸出的結果誤差不超過5%,也算對

一開始以為要高階資料結構,其實可以不要

問題實際在於要除以(i-j)

重點在於誤差不超過5%

所以我們可以估讀

當a×i小於100時,可以列舉

a×i大於100,可以把[1,x]分成100份[li,ri]

那麼每個區間內的所有力的和就可以估讀

ans+=d[i]*(s[ri]-s[li-1])/(i-(ri-li)/2)

也就是把所有的1/(i-j)≈1/(i-(ri-li)/2)

因為0.01<=a<=0.35,所以5%的誤差差不多

1 #include2 #include3 #include4 #include5

using

namespace

std;

6double a,ans[100001],d[100001],sum[100001];7

intn;

8int

main()

9 16

for (i=1;i<=n;i++)

1727

for (j=lim*100+1;j<=x;j++)

28 ans[i]+=d[i]*d[j]/(i-j);29}

30else

if (x<=100&&x)31

35}36for (i=1;i<=n;i++)

37 printf("

%.6lf\n

",ans[i]);

38 }

P3198 HNOI2008 遙遠的行星

傳送門 發現 a 不大,又允許較大的誤差,考慮亂搞 考慮求出每個位置的答案,因為有 1e5 個位置,所以每個位置差不多可以計算 100 次貢獻 所以把每個可以貢獻的位置盡量均勻分成 100 個塊,同乙個塊內答案一起算 本來乙個位置的貢獻是 m i m j i j 那現在乙個塊的貢獻就可以看成 m i...

HNOI2008 玩具裝箱

p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過 壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙...

HNOI 2008 玩具裝箱

p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為 1.n 的 n 件玩具,第i件玩具經過壓縮後變成一維長度為 ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...