jzoj3171-[GDOI2013模拟4]重心【真·物理,二分】
正題
題目大意
若干個(gè)長2高1的長方形且有不同的質(zhì)量。
對于若干個(gè)矩形的重心定義為∑mi?xi∑mi\frac{\sum m_i*x_i}{\sum m_i}∑mi?∑mi??xi??
要求每個(gè)矩形上面的所有矩形的x重心跟該矩形的x中點(diǎn)相距不超過1。
最底下的矩陣的右下角擺放在(?2,0)(-2,0)(?2,0)的位置求最上面最右能到多遠(yuǎn)。
解題思路
我們二分答案,然后只要最后重心能到0或以內(nèi)就可以了。
定義si=∑j=i+1nmjs_i=\sum_{j=i+1}^nm_jsi?=∑j=i+1n?mj?
從上到下擺放,先假設(shè)第一個(gè)擺放到無限遠(yuǎn)也就是重心G=∞G=\inftyG=∞
然后首先我們可以計(jì)算出如果往最右拜訪重心會(huì)到達(dá)哪里,
也就是(G?si+mi?(G?1))/(si+mi)(G*s_i+m_i*(G-1))/(s_i+m_i)(G?si?+mi??(G?1))/(si?+mi?)
但是如果我們發(fā)現(xiàn)這時(shí)候已經(jīng)不可以穩(wěn)定了也就是
G?(si+mi)>(lim?2)?si+(lim?1)?miG*(s_i+m_i)>(lim-2)*s_i+(lim-1)*m_iG?(si?+mi?)>(lim?2)?si?+(lim?1)?mi?
那么我們就整體向左邊移動(dòng)使得
G=((lim?2)?si+(lim?1)?mi)/(si+mi)G=((lim-2)*s_i+(lim-1)*m_i)/(s_i+m_i)G=((lim?2)?si?+(lim?1)?mi?)/(si?+mi?)
時(shí)間復(fù)雜度O(nlog(n?106))O(n\ log\ (n*10^6))O(n?log?(n?106))
codecodecode
#include<cstdio> #include<algorithm> #define ll long long using namespace std; const double eps=1e-9; const ll N=310000; ll n,m[N],s[N]; bool check(double lim) {double G=1e9;for(ll i=n;i>=2;i--){G=(G*s[i]+m[i]*(G-1))/(s[i]+m[i]);if(G*(s[i]+m[i])>(lim-2)*s[i]+(lim-1)*m[i])G=((lim-2)*s[i]+(lim-1)*m[i])/(s[i]+m[i]);}return G<=0; } int main() {scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&m[i]);for(ll i=n-1;i;i--)s[i]=s[i+1]+m[i+1];double l=0,r=n;while(r-l>eps){double mid=(r+l)/2;if(check(mid)) l=mid;else r=mid;}printf("%.9lf",l); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的jzoj3171-[GDOI2013模拟4]重心【真·物理,二分】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jzoj3170-[GDOI2013模拟
- 下一篇: 欢乐纪中A组周六赛【2019.4.13】