CODEVS1138聪明的质检员2011T5

题目描述 Description

小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi。检验矿产的流程是:见图

若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。

思路: 题目描述。。。像个新定义的题。。。我真是。。。比较简单,可以看出w越大,y越小。用二分,每次都更新前缀和数组,然后计算,比较左右端点和终点时计算的值和s的关系,然后进行下去,直到左右端点相邻。

code:

#include<iostream>

#include<cstdio>

#include<cmath>

using namespace std;

int v[200001]={0},w[200001]={0},li[200001]={0},ri[200001]={0};

long long sum[200001]={0},vv[200001]={0};

int main()

{

int i,j,n,m,mid,ll=0,rr=0;

long long s=0,ans=0,ans1=0,ans2=0;

scanf("%d%d%lld",&n,&m,&s);

for (i=1;i<=n;++i)

{

scanf("%d%d",&w[i],&v[i]);

if (w[i]>rr) rr=w[i];

sum[i]=sum[i-1]+1;

vv[i]=vv[i-1]+v[i];

}

for (i=1;i<=m;++i)

{

scanf("%d%d",&li[i],&ri[i]);

--li[i];

ans1=ans1+(vv[ri[i]]-vv[li[i]])*(sum[ri[i]]-sum[li[i]]);

}

++rr;

ll=1;

while (ll<rr-1)

{

mid=(ll+rr)/2;

for (i=1;i<=n;++i)

{

sum[i]=sum[i-1];

if (w[i]>=mid)

++sum[i];

}

for (i=1;i<=n;++i)

{

vv[i]=vv[i-1];

if (w[i]>=mid)

vv[i]+=v[i];

}

ans=0;

for (i=1;i<=m;++i)

ans+=(sum[ri[i]]-sum[li[i]])*(vv[ri[i]]-vv[li[i]]);

if (ans>=s&&s>=ans2)

{

ll=mid;

ans1=ans;

}

if (ans<=s&&s<=ans1)

{

rr=mid;

ans2=ans;

}

}

ans=min(abs(ans1-s),abs(ans2-s));

printf("%lld\n",ans);

}

时间: 2024-11-05 11:36:16

CODEVS1138聪明的质检员2011T5的相关文章

[NOIP 2011] 聪明的质检员

聪明的质检员 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2.选出一个参数W:3.对于一个区间[Li,Ri],计算矿石在这个区间上的 检验值$Y_i$:\[Y_i=(\sum_j {1}) \times(\sum_j v_j) ,j \in [L_i,R_i] \land \: w_i \geqslant W\] 其中 $j$ 为矿石编号 这批矿产的 

【NOIP2011】聪明的质检员

Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1. 给定 m个区间[Li,Ri]: 2. 选出一个参数W: 3. 对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: 这批矿产的检验结果Y为各个区间的检验值之和.即: 若这批矿产的检验结果与所给标准值 S 相差太多,就需要再去检验另一批矿产.小 T 不想费时间去检验另一批矿产,所以他想通过调整参数 W

NOIP2011 聪明的质检员

描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2.选出一个参数W:3.对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:Yi=(∑j1)∗(∑jvj) ,  j∈[Li,Ri]且wj≥WYi=(∑j1)∗(∑jvj) ,  j∈[Li,Ri]且wj≥Wj是矿石编号 这批矿产的检验结果Y 为各个区间的检验值之和.即:Y=∑i=1mYiY=∑i=

NOIP2015聪明的质检员[二分 | 预处理]

背景 NOIP2011 day2 第二题 描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[Li ,Ri]: 2 .选出一个参数 W: 3 .对于一个区间[Li ,Ri],计算矿石在这个区间上的检验值Yi:Yi=Σ1*Σvj,Σ的循环变量为j,这里j要满足j∈[Li,Ri]且wj≥W,这里j是矿石编号. 这批矿产的检验结果Y为各个区间的检验值之和.ΣYi

Vijos P1740聪明的质检员

题目 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2.选出一个参数W:3.对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:Yi = ∑1*∑vj,j∈[Li, Ri]且wj ≥ W,j是矿石编号这批矿产的检验结果Y 为各个区间的检验值之和.即:Y = ∑Yi,i ∈[1, m]若这批矿产的检验结果与所给标准值S相差太多,就需要再去检验另一

[题解]聪明的质检员

// 此博文为迁移而来,写于2015年7月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6ft.html 1.题目 2.TAG NOIP提高组:二分答案:前缀和. 3.分析 首先题面一定要看懂,看清(上次我就是没有看懂).说白了,就是使W取一个最合适的值,使每一个所给区间内满足条件的矿石的数量乘上价值之和,最后计算总和使与S最近. 我们根据分值分布来分析算法: 1.30分算法:O(n^3),首先O(n)进行W

codeVS1138 聪明的质监员

二分水题.为什么要写这道题呢,因为要辨明long long的读入与输出. 经过俩天的调试(我还以为我代码写错了)... 发现codeVS,tyvj输入输出用lld,vijos用I64d 这篇题解除了我应该也不会有人看见..所以肯定还会有大量人入坑. 呜呼哀哉. #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> usin

洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

一道二分答案加前缀和 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 abs函数不支持long long !!! #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; cons

聪明的质检员

[Problem description] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi.检验矿产的流程是: 1.给定m 个区间[Li,Ri]: 2.选出一个参数W: 3.对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi : 这批矿的检验结果Y 为各个区间的检验值之和.即: 若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产.小T不想费时间去检验另一批矿产,所以他想通过调