[NOIP2011真題]聰明的質監員
題目背景
NOIP2011 DAY2 試題 2 。
題目描述
小T是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1 到 n 逐一編號,每個礦石都有自己的重量
1、給定 m 個區間
2、選出一個引數 W ;
3、對於一個區間
這批礦產的檢驗結果Y 為各個區間的檢驗值之和。即:
若這批礦產的檢驗結果與所給標準值 S 相差太多,就需要再去檢驗另一批礦產。小 T 不想費時間去檢驗另一批礦產,所以他想通過調整引數 W 的值,讓檢驗結果儘可能的靠近標準值 S ,即使得 S-Y 的絕對值最小。請你幫忙求出這個最小值。
輸入格式
第一行包含三個整數 n,m,S,分別表示礦石的個數、區間的個數和標準值。
接下來的 n 行,每行 2 個整數,中間用空格隔開,第 i+1 行表示 i 號礦石的重量
接下來的 m 行,表示區間,每行 2 個整數,中間用空格隔開,第 i+n+1 行表示區間
輸出格式
輸出只有一行,包含一個整數,表示所求的最小值。
樣例資料
輸入
5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3
輸出
10
備註
【樣例說明】
當 W 選 4 的時候,三個區間上檢驗值分別為 20、5、0,這批礦產的檢驗結果為 25,此時與標準值 S 相差最小為 10 。
【資料範圍】
對於 10% 的資料,有
對於 30% 的資料,有
對於 50% 的資料,有
對於 70% 的資料,有
對於 100% 的資料,有
分析: 二分答案。題意可能有人會看不懂,意思是在每個詢問區間中,求滿足條件的礦石個數*這些礦石的價值總和的值,再把這些值累加,和Y比較。直接二分w,顯然w越大,計算出來的y越小,如果計算出來的y大於了s,就把w變大,反之,把w變小。
程式碼:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<set>
#include<queue>
#include<map>
#include<map>
#include<iomanip>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int n,m,num[maxn],w[maxn],v[maxn],l[maxn],r[maxn];
long long sum[maxn],ans,s;
int getint()
{
char ch;int i=0,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') {ch=getchar();f=-1;}
for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';
return i*f;
}
long long check(int x)
{
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
ans=0;
for(int i=1;i<=n;i++)
{
num[i]=num[i-1];
if(w[i]>=x) num[i]++;
sum[i]=sum[i-1];
if(w[i]>=x) sum[i]+=v[i];
}
for(int i=1;i<=m;i++)
ans+=((num[r[i]]-num[l[i]-1])*(sum[r[i]]-sum[l[i]-1]));
return ans;
}
long long half()
{
int l=0,r=100000010,mid;
long long ret,ret1,ret2,ret3;
while(l<=r)
{
mid=(l+r)>>1;
ret=check(mid);
if(ret==s) break;
if(ret>s)
l=mid+1;
else
r=mid-1;
}
if(ret==s) return ret;
ret1=check(l);ret2=check(r);
if(abs(ret1-s)<=abs(ret2-s)) return ret1;
if(abs(ret2-s)<=abs(ret1-s)) return ret2;
}
int main()
{
freopen("check.in","r",stdin);
freopen("check.out","w",stdout);
n=getint();m=getint();scanf("%I64d",&s);
for(int i=1;i<=n;i++)
{
w[i]=getint();
v[i]=getint();
}
for(int i=1;i<=m;i++)
{
l[i]=getint();
r[i]=getint();
}
printf("%I64d",abs(half()-s));
return 0;
}
本題結。
相關推薦
[NOIP2011真題]聰明的質監員
題目背景 NOIP2011 DAY2 試題 2 。 題目描述 小T是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1 到 n 逐一編號,每個礦石都有自己的重量 wi 以
二分查找前綴和(洛谷1314聰明的質監員NOIP2011提高組)
ron min 最小值 一個數 -s 判斷 inf bre sync 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是: 1 、給定m 個區間[Li,Ri
NOIP2011聰明的質監員題解
輸入輸出 std under pri efault abs iostream using nbsp 631. [NOIP2011] 聰明的質監員 ★★ 輸入文件:qc.in 輸出文件:qc.out 簡單對比時間限制:1 s 內存限制:128 MB 【問題描述
luoguP1314 聰明的質監員 題解(NOIP2011)
() main include ostream bsp algo namespace lin etc P1314 聰明的質監員 題目 #include<iostream> #include<cstdlib> #include<cstdio&g
NOIP2011聰明的質監員
檢驗 dig mem 代碼 for bsp ase mes 又是 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 nn 個礦石,從 11到nn逐一編號,每個礦石都有自己的重量 w_iwi? 以及價值v_ivi? 。檢驗礦產的流程是: 1 、給定mm個區間
全國資訊學奧林匹克聯賽(NOIP2011)複賽 提高組 day2 T2 聰明的質監員
講過二分已經一段時間,現在老師又找一道二分題來練手#A#,起初就是對兩個大大的西格瑪有點興趣,做起來發現這題出題人還是很心機的啊啊! 現在來一波題目: 2.聰明的質監員 (qc.cpp/c/pas) 【問題描述】 小 T 是一名質量監督員,最近
[noip2011]聰明的質監員
題目描述 Description 小 T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是:見圖 若這批礦產的檢驗結果與所給標準值S 相差太多,就需要再去檢驗
NOIP2011 Day2 T2 聰明的質監員
W越大,Y越小,所以可以二分W使Y接近S。 少用min、abs可以讓思路更清晰。 #include<cstdio> #include<cstring> #include&
離散+二分+字首和 [NOIP2011] 聰明的質監員
[NOIP2011] 聰明的質監員 時間限制:1 s 記憶體限制:128 MB 【問題描述】 小 T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n個礦石,從 1 到n逐一編號,每個礦石都有自己的重量wi以及價值vi。檢驗礦產的流程是: 1.
Code[vs] 1138— NOIP2011 聰明的質監員 (二分答案+字首和)
題目連結 題意: 有n個礦石,每個礦石有重量和價值兩個引數,質檢員可以調節一個最低重量w,每個區間的檢查值為該區間內重量>=w的礦石價值和 *(重量>=w的個數),求m個區間的檢查值之和 與 標準值s之差的絕對值的最小值 題解: 檢查值之和 只和 w 有
[NOIP2011]聰明的質監員 D2 T2 二分答案
Time Limit: 1 Sec Memory Limit: 128 MB Description 小 T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。
noip2011 day2-2 聰明的質監員
題目描述 小 T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1 到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是: 1、給定m 個區間[Li
洛谷 P1314 [NOIP2011 D2T2] 聰明的質監員
題目描述 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是: 1 、給定m 個區間[Li,Ri]; 2 、選出一個引數 W; 3 、對於一個區間[Li
noip2011 聰明的質監員 (二分+字首和處理+讀入優化)
第一行包含三個整數n,m,S,分別表示礦石的個數、區間的個數和標準值。 接下來的n行,每行2個整數,中間用空格隔開,第i+1行表示i號礦石的重量wi和價值vi 。 接下來的m行,表示區間,每行2個整數,中間用空格隔開,第i+n+1行表示區間[Li,Ri]的兩個端點Li和Ri。注意:不同區間可能重合或相互重疊
[NOIP2011] 聰明的質監員 二分+字首和
考試的時候打的二分但沒有用字首和維護。但是有個小細節手誤打錯了結果掛掉了。 絕對值的話可能會想到三分,但是注意到w增大的時候y是減小的,所以單調性很明顯,用二分就可以。但注意一個問題,就是二分最後的結果不一定是最優的,只是在它屬於的符號裡是最優的,所以需要最後存正負的最優解
二分查詢字首和(洛谷1314聰明的質監員NOIP2011提高組)
小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是: 1 、給定m 個區間[Li,Ri]; 2 、選出一個引數 W; 3 、對於一個區間[Li,Ri],計算礦石在這
P1314 聰明的質監員
fin sin 數據 color 空格 tmp ... 個數 pac P1314 聰明的質監員 題目描述 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以
luogu P1314 聰明的質監員 x
sca 簡單 最小 最小值 第一個 其中 d+ 計算 long P1314 聰明的質監員(至於為什麽選擇這個題目,可能是我覺得比較好玩唄) 題目描述 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的
luogu P1314 聰明的質監員
相互 name 二分 upload names 格式 註意 ++ 負責 題目描述 小T 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是: 1 、給定m 個區間[
[Codevs] 1138 聰明的質監員
wrapper 時間 output check 1年 n+1 app cti scan 1138 聰明的質監員 2011年NOIP全國聯賽提高組 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold