Luogu P1314 [NOIp提高组2011]聪明的质监员
2017-08-19 20:28
281 查看
题目描述
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:
1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:
这批矿产的检验结果Y 为各个区间的检验值之和。即:Y1+Y2…+Ym
若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T
不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近
标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。
二分W,前缀和优化。
代码
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:
1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:
这批矿产的检验结果Y 为各个区间的检验值之和。即:Y1+Y2…+Ym
若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T
不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近
标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。
二分W,前缀和优化。
代码
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; typedef long long LL; const int maxn=200010; int w[maxn],v[maxn],l[maxn],r[maxn]; long long sum1[maxn],sum2[maxn]; int main(){ int n,m,maxw=0; long long s; cin>>n& b8ab gt;>m>>s; for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]),maxw=max(maxw,w[i]); for(int i=0;i<m;i++) scanf("%d%d",&l[i],&r[i]); int L=1,R=maxw; LL ans; while(L<R-1){ int M=L+R>>1; LL a=0; sum1[0]=0; sum2[0]=0; for(int i=1;i<=n;i++){ sum1[i]=sum1[i-1]; sum2[i]=sum2[i-1]; if(w[i]>=M) sum1[i]++,sum2[i]+=v[i]; } for(int i=0;i<m;i++) a+=(sum1[r[i]]-sum1[l[i]-1])*(sum2[r[i]]-sum2[l[i]-1]); if(a>=s) L=M; else R=M; } //二分后不知道什么是答案,就复制粘贴了一波... LL a=0; sum1[0]=0; sum2[0]=0; for(int i=1;i<=n;i++){ sum1[i]=sum1[i-1]; sum2[i]=sum2[i-1]; if(w[i]>=R) sum1[i]++,sum2[i]+=v[i]; } for(int i=0;i<m;i++) a+=(sum1[r[i]]-sum1[l[i]-1])*(sum2[r[i]]-sum2[l[i]-1]); ans=abs(a-s); sum1[0]=0; sum2[0]=0; a=0; for(int i=1;i<=n;i++){ sum1[i]=sum1[i-1]; sum2[i]=sum2[i-1]; if(w[i]>=L) sum1[i]++,sum2[i]+=v[i]; } for(int i=0;i<m;i++) a+=(sum1[r[i]]-sum1[l[i]-1])*(sum2[r[i]]-sum2[l[i]-1]); cout<<min(ans,abs(a-s))<<endl; return 0; }
相关文章推荐
- 二分查找前缀和(洛谷1314聪明的质监员NOIP2011提高组)
- [NOIP2011提高组]聪明的质监员
- 洛谷P1314 [NOIP2011提高组Day2T2] 聪明的质监员
- [NOIP2011提高组day2]-2-聪明的质监员
- NOIP2011提高组 聪明的质监员 -SilverN
- NOIP提高组2011 聪明的质监员
- 【noip2011提高组】 聪明的质监员 前缀和+二分
- NOIP 2011 提高组 复赛 day2 qc 聪明的质监员
- NOIP 2011 提高组 聪明的质监员
- [luogu-1314]noip2011 day2-T2聪明的质监员 题解
- NOIP2011提高组 聪明的质监员 -SilverN
- NOIP2011复赛提高组day2(A:计算系数 B:聪明的质监员 C:观光公交)
- 【NOIP2011提高组T5】聪明的质监员-二分答案+前缀和
- 全国信息学奥林匹克联赛(NOIP2011)复赛 提高组 day2 T2 聪明的质监员
- LuoguP1314[NOIP2011] 聪明的质监员 解题报告【二分答案+前缀和】
- [NOIP2011] 提高组 洛谷P1314 聪明的质监员
- NOIP2011提高组 聪明的质监员 -SilverN
- NOIP2011 聪明的质监员
- 【NOIP2011】 聪明的质监员
- [NOIP2011] 聪明的质监员 二分+前缀和