聰明的質監員
描述小t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有 n 個礦石,從 1到n 逐一編號,每個礦石都有自己的重量 wi 以及價值vi 。檢驗礦產的流程是:
1 、給定m 個區間[li,ri];
2 、選出乙個引數 w;
3 、對於乙個區間[li,ri],計算礦石在這個區間上的檢驗值yi:
20170621090116_13601
這批礦產的檢驗結果y 為各個區間的檢驗值之和。即:y1+y2…+ym
若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t
不想費時間去檢驗另一批礦產,所以他想通過調整引數w 的值,讓檢驗結果盡可能的靠近
標準值s,即使得s-y 的絕對值最小。請你幫忙求出這個最小值。
輸入第一行包含三個整數n,m,s,分別表示礦石的個數、區間的個數和標準值。
接下來的n 行,每行2個整數,中間用空格隔開,第i+1 行表示 i 號礦石的重量 wi 和價值vi。
接下來的m 行,表示區間,每行2 個整數,中間用空格隔開,第i+n+1 行表示區間[li,ri]的兩個端點li 和ri。注意:不同區間可能重合或相互重疊。
輸出輸出只有一行,包含乙個整數,表示所求的最小值。
樣例輸入 [複製]
5 3 15
1 52 5
3 54 5
5 51 5
2 43 3
樣例輸出 [複製]
10這道題是乙個裸的二分。單調性易證。二分w的大小。但要注意,字首和應當在二分的check函式裡寫。只能算對當前mid的sum值。(細節一定要小心!!!!!)
#include
using
namespace std;
#define int long long
inline
intread()
const
int inf=
1e18
;const
int n=
2e5+10;
int n,m,s;
int sum[n]
;struct nodee[n]
;int l1[n]
,r1[n]
;int cnt[n]
;inline
intcheck
(int mid)
}for
(int i=
1;i<=m;i++
)return tmp;
}signed
main()
for(
int i=
1;i<=m;i++
)int l=
0,r=mx+
1,mid;
int ans=inf;
while
(l<=r)
printf
("%lld"
,ans)
;return0;
}
聰明的質監員
noip2011 day2 t2 題目描述 小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是 見圖 若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗...
聰明的質監員
本題是乙個比較明顯的二分題,顯然可以看出來這個標準值s是可以二分的,之後如果暴力o nmlog1e6 就是50分。但我們顯然不用暴力,這裡我們可以先預掃一遍陣列,並用字首和存w和v,之後再乙個o m 暴力判斷就可以了。和大於標準時加大l以加大mid,小於時減少r。並一定要注意l和r的初始大小,l為所...
聰明的質監員
字首和 二分答案的一道好題。不難看出這個w和礦石的重量是有關係的。礦石的重量的最大值和最小值可以記錄出來,這樣w便有界。根據題意w所在區間顯然可以單調,所以可以使用二分進行求解。我們二分w,然後去計算以這個w為答案的值與標準值相比較。二分的check函式用字首和維護就可以。通常的做法是開兩個陣列,乙...