【二分】NOIP2011聪明的质检员
2012-07-12 13:43
337 查看
进行二分查找即可,我就不多说废话了。
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; void preprocess(int weight); struct Node{ int l,r; }; const int SIZE=200005; Node node[SIZE]; int n,counter[SIZE],wei[SIZE],value[SIZE]; double total[SIZE]; int main(){ double interval,min_dis,tmp; double standard; int left,right; cin>>n>>interval>>standard; double sum=0; int maximum=-1; for(int i=1;i<=n;i++){ scanf("%d%d",&wei[i],&value[i]); maximum=max(wei[i],maximum); sum+=value[i]; } min_dis=sum*n; for(int i=1;i<=interval;i++){ scanf("%d%d",&node[i].l,&node[i].r); //node[i].l--; node[i].r--; } left=0; right=maximum; //进行二分查找 while(left<=right){ //cout<<"left: "<<left<<" right: "<<right<<endl; int middle=(left+right)/2; //动态规划,O(n)的时间完成预处理 preprocess(middle); tmp=0; for(int i=1;i<=interval;i++){ tmp+=(counter[node[i].r]-counter[node[i].l-1])*(total[node[i].r]-total[node[i].l-1]); } //所选的重量越大,检验量就会越大,毫无意义 if(tmp>standard) left=middle+1; else if(tmp<standard) right=middle-1; else if(tmp==standard){ min_dis=standard; break; } if(fabs(tmp-standard)<fabs(min_dis-standard)) min_dis=tmp; //if((tmp>=standard&&tmp<min_dis)||(tmp<standard&&tmp>min_dis)) // min_dis=tmp; //cout<<"middle: "<<middle<<" min_dis "<<min_dis<<endl; } if(min_dis>standard) cout<<fixed<<setprecision(0)<<min_dis-standard<<endl; else cout<<fixed<<setprecision(0)<<standard-min_dis<<endl; //system("pause"); return 0; } void preprocess(int weight){ counter[0]=0; total[0]=0; if(wei[1]>=weight){ counter[1]=1; total[1]=value[1]; } else{ counter[1]=0; total[1]=0; } for(int i=2;i<=n;i++){ if(wei[i]>=weight){ counter[i]=counter[i-1]+1; total[i]=total[i-1]+value[i]; } else{ counter[i]=counter[i-1]; total[i]=total[i-1]; } } return; }
相关文章推荐
- NOIP2011提高组 聪明的质检员(二分答案)
- 【NOIP 2011 Day2 T2】聪明的质检员(二分)
- NOIP 2011 - 提高组 聪明的质检员 二分+前缀和 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 2
- Luogu 1314 【NOIP2011】聪明的质检员 (二分)
- NOIP2011 聪明的质检员 二分
- [NOIP 2011] 聪明的质检员:二分,前缀和
- 【NOIP2011】聪明的质检员 二分
- 洛谷 1314||NOIP 2011 聪明的质检员 二分 解题报告
- [NOIP 2011]聪明的质检员 二分+前缀和
- NOIP2011 聪明的质检员
- [NOIP2011]聪明的质监员 D2 T2 二分答案
- [FT][1]NOIP 2011 聪明的质检员
- Noip2011 Day2 T2 聪明的质监员 (二分+前缀和)
- [NOIP 2011] 聪明的质检员
- noip2011聪明的质检员
- NOIP2011 聪明的质监员(二分)
- NOIP2011 tyvj1696 聪明的质检员
- NOIP2011提高组 聪明的质检员
- 【二分】【Noip2011】聪明的质监员
- NOIP2011 聪明的质检员