洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解
1.洛谷P1028 [NOIP 2001 普及组] 数的计算 题解2.洛谷P1464 Function 题解3.洛谷P2440 木材加工 题解4.洛谷P2678 [NOIP 2015 提高组] 跳石头 题解
5.洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解
6.洛谷P1083 [NOIP 2012 提高组] 借教室 题解7.洛谷P1902 刺杀大使 题解8.洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解9.洛谷P2280 [HNOI2003] 激光炸弹 题解10.洛谷P8218 【深进1.例1】求区间和 题解11.洛谷 P1719 最大加权矩形 题解12.洛谷 P2367 语文成绩 题解13.洛谷P1387 最大正方形 题解14.洛谷P1014[NOIP 1999 普及组] Cantor 表 题解15.洛谷P1563 [NOIP 2016 提高组] 玩具谜题 题解16.洛谷P4924 [1007] 魔法少女小Scarlet 题解17.洛谷P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题解18.洛谷P1786 帮贡排序 题解19.洛谷P1990 覆盖墙壁 题解20.洛谷P1010 [NOIP 1998 普及组] 幂次方 题解21.洛谷P1259 黑白棋子的移动 题解22.洛谷P1281 书的复制 题解23.洛谷P1396 营救 题解24.洛谷PP1570 KC 喝咖啡25.洛谷P1661 扩散 题解26.洛谷P1843 奶牛晒衣服 题解洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解
题目
题解
思路
这题可以使用前缀和优化+二分答案法求解。
首先读入\(m\)组区间,左右端点分别存放到数组\(left_i\)和\(right_i\)中。二分查找\(W\),左边界\(l\)和右边界\(r\)初始值分别为0和1000001,每次调用一个函数\(check(int\ x)\)用于判断当\(W=x\)时是否满足需求。
\(check\)细节:求出\(y\)的值后,返回\(y>s\),并更新最小值。
当\(y>s\)时,意味着\(W\)小了(具体看公式),所以提高\(W\)的取值范围,否则减小\(W\)的取值范围。
最后输出一直在比较大小的答案值\(ans\)就可以啦。
代码
#include<bits/stdc++.h> #define endl '\n' #define INF 0x7fffffff #define EPS 1e-8 using namespace std; long long n,m,s,ans=LLONG_MAX,W2,sum,s1[200005],s2[200005],w[200005],v[200005],l[200005],r[200005]; void check(int W){ for(int i=1;i<=n;i++){ s1[i]=s1[i-1]+(w[i]>=W); s2[i]=s2[i-1]+((w[i]>=W)?v[i]:0); } sum=0; for(int i=1;i<=m;i++){ sum+=(s1[r[i]]-s1[l[i]-1])*(s2[r[i]]-s2[l[i]-1]); } ans=min(ans,abs(s-sum)); } int main(){ cin>>n>>m>>s; long long mxw=-1; for(int i=1;i<=n;i++){ cin>>w[i]>>v[i]; mxw=max(mxw,w[i]); } for(int i=1;i<=m;i++){ cin>>l[i]>>r[i]; } long long left=0,right=mxw+1; while(left<=right){ long long mid=(left+right)/2; check(mid); sum>s?left=mid+1:right=mid-1; } cout<<ans<<endl; return 0; }
本文作者:2789617221guo
本文链接:https://www.cnblogs.com/2789617221guo/p/18703134
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步