NOIP2011 聪明的质监员
生活随笔
收集整理的這篇文章主要介紹了
NOIP2011 聪明的质监员
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述
小T?是一名質(zhì)量監(jiān)督員,最近負(fù)責(zé)檢驗(yàn)一批礦產(chǎn)的質(zhì)量。這批礦產(chǎn)共有?n?個(gè)礦石,從?1到n?逐一編號(hào),每個(gè)礦石都有自己的重量?wi?以及價(jià)值vi?。檢驗(yàn)礦產(chǎn)的流程是:?1?、給定m?個(gè)區(qū)間[Li?,Ri];?
2?、選出一個(gè)參數(shù)?W;?
3?、對(duì)于一個(gè)區(qū)間[Li?,Ri],計(jì)算礦石在這個(gè)區(qū)間上的檢驗(yàn)值Yi:
Yi=Σ1*Σvj,Σ的循環(huán)變量為j,這里j要滿足j∈[Li,Ri]且wj≥W,這里j是礦石編號(hào)。
這批礦產(chǎn)的檢驗(yàn)結(jié)果Y為各個(gè)區(qū)間的檢驗(yàn)值之和。ΣYi,Σ的循環(huán)變量為i,1≤i≤m。
若這批礦產(chǎn)的檢驗(yàn)結(jié)果與所給標(biāo)準(zhǔn)值S?相差太多,就需要再去檢驗(yàn)另一批礦產(chǎn)。小T不想費(fèi)時(shí)間去檢驗(yàn)另一批礦產(chǎn),所以他想通過(guò)調(diào)整參數(shù)W?的值,讓檢驗(yàn)結(jié)果盡可能的靠近標(biāo)準(zhǔn)值S,即使得S-Y?的絕對(duì)值最小。請(qǐng)你幫忙求出這個(gè)最小值。?
輸入格式
第一行包含三個(gè)整數(shù)n?,m,S,分別表示礦石的個(gè)數(shù)、區(qū)間的個(gè)數(shù)和標(biāo)準(zhǔn)值。?接下來(lái)的n?行,每行?2?個(gè)整數(shù),中間用空格隔開(kāi),第i+1?行表示?i?號(hào)礦石的重量?wi?和價(jià)值vi?。?接下來(lái)的m?行,表示區(qū)間,每行2?個(gè)整數(shù),中間用空格隔開(kāi),第i+n+1?行表示區(qū)間[Li,?Ri]的兩個(gè)端點(diǎn)?Li?和Ri?。注意:不同區(qū)間可能重合或相互重疊。?
輸出格式
輸出只有一行,包含一個(gè)整數(shù),表示所求的最小值。?測(cè)試樣例1
輸入
5 3 15?1 5?
2 5?
3 5?
4 5?
5 5?
1 5?
2 4?
3 3
輸出
10?對(duì)樣例的解釋?
當(dāng)W 選4 的時(shí)候,三個(gè)區(qū)間上檢驗(yàn)值分別為 20、5 、0 ,這批礦產(chǎn)的檢驗(yàn)結(jié)果為 25,此時(shí)與標(biāo)準(zhǔn)值S 相差最小為10。
備注
對(duì)于10%?的數(shù)據(jù),有?1?≤n?,m≤10;?對(duì)于30%?的數(shù)據(jù),有?1?≤n?,m≤500?;?
對(duì)于50%?的數(shù)據(jù),有?1?≤n?,m≤5,000;?
對(duì)于70%?的數(shù)據(jù),有?1?≤n?,m≤10,000?;?
對(duì)于100%的數(shù)據(jù),有?1?≤n?,m≤200,000,0?<?wi,?vi≤10^6,0?<?S≤10^12,1?≤Li?≤Ri?≤n?。? 注意區(qū)間的處理,每次檢查都要再算一遍前綴和 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; const int maxn = 220005; struct STONE{long long w;long long v; }; long long n,m,s,l[maxn],r[maxn],sum[maxn],sumv[maxn],all,ans = 98765432112345L; STONE stone[maxn]; void input(){cin>>n>>m>>s;all = 0;for(int i = 1;i <= n;i++){scanf("%lld%lld",&stone[i].w,&stone[i].v);if(all < stone[i].w) all = stone[i].w;}for(int i = 1;i <= m;i++){scanf("%lld%lld",&l[i],&r[i]);} } bool check(long long t){sum[0] = sumv[0] = 0;for(int i = 1;i <= n;i++){if(stone[i].w >= t){sumv[i] = sumv[i-1] + stone[i].v;sum[i] = sum[i-1] + 1;}else{sumv[i] = sumv[i-1];sum[i] = sum[i-1];}}all = 0;for(int i = 1;i <= m;i++){all += (sumv[r[i]] - sumv[l[i]-1]) * (sum[r[i]] - sum[l[i]-1]);}ans = min(abs(all - s),ans);return all < s; } void div(){long long lans = 0,rans = all,mans;while(lans <= rans){mans = (lans + rans) >> 1;if(check(mans)){rans = mans - 1;}else{lans = mans + 1;}}check(mans+1);if(mans > 0)check(mans-1);cout<<ans; } int main(){input();div();return 0; } View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/hyfer/p/5656217.html
總結(jié)
以上是生活随笔為你收集整理的NOIP2011 聪明的质监员的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用python去除红章
- 下一篇: 二进制位运算