NOIP2011 DAY2 T2 浅谈二分答案
2017-10-16 22:01
330 查看
世界真的很大
今天晚上算是正式进入数论的复习范围了
捡了几道NOIP的历年数论题来练手,除了高精度以外
这道题一开始独体硬是没有读懂
然后读懂了之后还算是比较简单233
看题先:
description:
这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi。检验矿产的流程是: 1、给定 m 个区间[Li,Ri]; 2、选出一个参数 W; 3、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值 Yi : Yi = ∑1* ∑v j , j ∈[Li , Ri ] 且 w j ≥ W ,j 是矿石编号 j j m
这批矿产的检验结果 Y 为各个区间的检验值之和。即:Y = ∑Y i i =1 若这批矿产的检验结果与所给标准值 S 相差太多,就需要再去检验另一批矿产。小 T 不想费时间去检验另一批矿产,所以他想通过调整参数 W 的值,让检验结果尽可能的靠近 标准值 S,即使得 S-Y 的绝对值最小。请你帮忙求出这个最小值。
input:
输入文件 qc.in。第一行包含三个整数 n,m,S,分别表示矿石的个数、区间的个数和标准值。
接下来的 n行,每行 2个整数,中间用空格隔开,第 i+1 行表示 i 号矿石的重量 wi 和价
值 vi 。
接下来的 m行,表示区间,每行 2个整数,中间用空格隔开,第 i+n+1 行表示区间[Li, Ri]的两个端点 Li 和 Ri。注意:不同区间可能重合或相互重叠。
output:
输出文件名为 qc.out。输出只有一行,包含一个整数,表示所求的最小值。
题目求一个W使得每一段区间重量大于等于W的个数乘以大于等于W的物品的全职和离标准值差距最小,并求出这个差距
读懂样例之后,分析一下这个W
既然要使得通过W的变化,让最后的值与标准值差距最小,那么W与实际值之间必然有什么关系
W影响的是每一段区间选取的那些数,而且随着W的增加,选取的书的范围比方单调不上升,即下降或不变
题目中是说使得“差值”最小,即是说让我们通过控制W的变化,使得实际值尽量接近差值,而且W与实际值之间还有单调的函数关系
应该能想到二分,毕竟二分的原理就是尽可能的去逼近一个可能的值
然后每次重新求一下比W大的物品的个数的前缀和,还有比W大的物品的权值的前缀和
每次n+m来check
完整代码:
#include<stdio.h> #include<algorithm> using namespace std; typedef long long dnt; const dnt INF=1000000000000LL; int n,m; int l[200010],r[200010],tot[200010]; dnt S,ans=INF,SUM=0; dnt v[200010],w[200010],sum[200010]; dnt check(dnt mid) { dnt rt=0; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(w[i]>=mid); for(int i=1;i<=n;i++) tot[i]=tot[i-1]+(w[i]>=mid)*v[i]; for(int i=1;i<=m;i++) rt+=(sum[r[i]]-sum[l[i]-1]) * (tot[r[i]]-tot[l[i]-1]); return rt; } int main() { scanf("%d%d%lld",&n,&m,&S); for(int i=1;i<=n;i++) scanf("%lld%lld",&w[i],&v[i]),SUM+=v[i]; for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]); int lf=0,rg=SUM; while(lf<=rg) { int mid=(lf+rg)>>1; dnt tmp=check(mid); if(tmp>=S) lf=mid+1,ans=min(ans,tmp-S); else rg=mid-1,ans=min(ans,S-tmp); } printf("%lld\n",ans); return 0; } /* Whoso pulleth out this stone and anvil is duly born King of all England */
嗯,就是这样
相关文章推荐
- Noip2011 Day2 T2 聪明的质监员 (二分+前缀和)
- 【NOIP 2011 Day2 T2】聪明的质检员(二分)
- [NOIP2011]聪明的质监员 D2 T2 二分答案
- Noip2012 Day2 T2 借教室 (二分答案+差分)
- Luogu 1314(二分答案)(NOIP 2011)
- Noip 提高组 2011 Day2 T2 聪明的质检员 二分法
- LuoguP1314[NOIP2011] 聪明的质监员 解题报告【二分答案+前缀和】
- Noip2015 Day2 T1 跳石头(二分答案)
- 洛谷Luogu-267 跳石头(NOIP提高组2015 day2 t1)(二分答案) HQG_AC的博客
- 全国信息学奥林匹克联赛(NOIP2011)复赛 提高组 day2 T2 聪明的质监员
- UOJ 264 NOIP2016 DAY2 T2 浅谈队列单调性及辅助队列时间戳
- [luogu-1314]noip2011 day2-T2聪明的质监员 题解
- NOIP2011 Day2 T2 聪明的质监员
- NOIP2011提高组 聪明的质检员(二分答案)
- NOIP2012 Day2 借教室-二分答案+差分
- BZOJ 4326 NOIP 2015 DAY2 T3 浅谈二分及树上差分数组DFS动态统计
- 【NOIP 模拟题】[T2] 王者荣耀(二分答案+dp)
- 【NOIP2011提高组T5】聪明的质监员-二分答案+前缀和
- 二分答案-----noip2015 跳石头
- UOJ 265 NOIP 2016 DAY2 T3 浅谈预处理状态压缩动态规划