1. 程式人生 > >[NOIP2011真題]聰明的質監員

[NOIP2011真題]聰明的質監員

題目背景
NOIP2011 DAY2 試題 2 。

題目描述
小T是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1 到 n 逐一編號,每個礦石都有自己的重量 wi 以及價值 vi。檢驗礦產的流程是:
1、給定 m 個區間[Li,Ri]
2、選出一個引數 W ;
3、對於一個區間[Li,Ri],計算礦石在這個區間上的檢驗值 Yi:
這裡寫圖片描述
這批礦產的檢驗結果Y 為各個區間的檢驗值之和。即:
這裡寫圖片描述
若這批礦產的檢驗結果與所給標準值 S 相差太多,就需要再去檢驗另一批礦產。小 T 不想費時間去檢驗另一批礦產,所以他想通過調整引數 W 的值,讓檢驗結果儘可能的靠近標準值 S ,即使得 S-Y 的絕對值最小。請你幫忙求出這個最小值。

輸入格式
第一行包含三個整數 n,m,S,分別表示礦石的個數、區間的個數和標準值。

接下來的 n 行,每行 2 個整數,中間用空格隔開,第 i+1 行表示 i 號礦石的重量 wi 和價值 vi

接下來的 m 行,表示區間,每行 2 個整數,中間用空格隔開,第 i+n+1 行表示區間 [Li,Ri] 的兩個端點 LiRi。注意:不同區間可能重合或相互重疊。

輸出格式
輸出只有一行,包含一個整數,表示所求的最小值。

樣例資料
輸入
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% 的資料,有1nm10
對於 30% 的資料,有1nm500
對於 50% 的資料,有1nm5,000
對於 70% 的資料,有1nm10,000
對於 100% 的資料,有1nm200,0000<wi,vi1060<S10121LiRin

分析: 二分答案。題意可能有人會看不懂,意思是在每個詢問區間中,求滿足條件的礦石個數*這些礦石的價值總和的值,再把這些值累加,和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