德州万企互联网站制作,集团网站建设,有奖竞猜网站建设,专门制作网页的工具聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description小 T 是一名质量监督员#xff0c;最近负责检验一批矿产的质量。这批矿产共有n 个矿石#xff0c;从1到n 逐一编号#xff0c;每个矿石都有自己的重量wi 以… 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员最近负责检验一批矿产的质量。这批矿产共有n 个矿石从1到n 逐一编号每个矿石都有自己的重量wi 以及价值vi。检验矿产的流程是见图 若这批矿产的检验结果与所给标准值S 相差太多就需要再去检验另一批矿产。小T不想费时间去检验另一批矿产所以他想通过调整参数W 的值让检验结果尽可能的靠近标准值S即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。 输入描述 Input Description 第一行包含三个整数 nmS分别表示矿石的个数、区间的个数和标准值。接下来的 n 行每行2 个整数中间用空格隔开第i1 行表示i 号矿石的重量wi 和价值vi 。接下来的 m 行表示区间每行2 个整数中间用空格隔开第in1 行表示区间[Li,Ri]的两个端点Li 和Ri。注意不同区间可能重合或相互重叠。 输出描述 Output Description 输出只有一行包含一个整数表示所求的最小值。 样例输入 Sample Input 5 3 151 52 53 54 55 51 52 43 3 样例输出 Sample Output 10 数据范围及提示 Data Size Hint 当 W 选4 的时候三个区间上检验值分别为20、5、0这批矿产的检验结果为25此时与标准值S 相差最小为10。 数据范围对于 10%的数据有1≤nm≤10对于 30%的数据有1≤nm≤500对于 50%的数据有1≤nm≤5,000对于 70%的数据有1≤nm≤10,000对于 100%的数据有1≤nm≤200,0000 wi, vi≤1060 S≤10121≤Li≤Ri≤n。 /*
寻找单调性 发现W越大Y越小
可以二分W。则问题转化为求 abs(f(W)-S)的最小值。
如何快速求f(W)
发现可以前缀和预处理两个前缀和一个记录大于W 的Σvi 一个记录大于W 的个数。
嗯ans初始值往死大死大里设不然就莫名其妙WA WA WA
*/
#includeiostream
#includecstdio
#includecstring
#includecstdlib#define N 200007
#define ll long longusing namespace std;
ll n,m,k,ans,cnt,S,Y;
ll w[N],v[N],L[N],R[N];
ll sum[N],sum2[N];inline ll read()
{ll x0,f1;char cgetchar();while(c9||c0){if(c-)f-1;cgetchar();}while(c0c9){xx*10c-0;cgetchar();}return x*f;
}int main()
{nread();mread();Sread();for(ll i1;in;i) w[i]read(),v[i]read(),kmax(k,w[i]);for(ll i1;im;i) L[i]read(),R[i]read();ans999999999999999999;ll l0,rk1,mid;while(lr){midlr1;Y0;for(ll i1;in;i){if(w[i]mid) sum[i]sum[i-1]v[i],sum2[i]sum2[i-1]1;else sum[i]sum[i-1],sum2[i]sum2[i-1];} for(ll i1;im;i)Y(sum[R[i]]-sum[L[i]-1])*(sum2[R[i]]-sum2[L[i]-1]);if(Y-S0) ansmin(ans,abs(Y-S)),lmid1;else ansmin(ans,abs(Y-S)),rmid-1;}printf(%lld\n,ans);return 0;
} 转载于:https://www.cnblogs.com/L-Memory/p/7732081.html