直線上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.335624
輸出樣例#1:複製
0.0000000.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 #include5using
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教授要求在乙個一維容器中的玩具編號是連續的。同時...