聰明的質監員(codevs 1138)題解

2021-07-09 09:34:38 字數 2317 閱讀 2078

【問題描述】

小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是:見圖

若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批礦產,所以他想通過調整引數w 的值,讓檢驗結果盡可能的靠近標準值s,即使得s-y 的絕對值最小。請你幫忙求出這個最小值。

5 3 15

1 52 5

3 54 5

5 51 5

2 43 3 10

本題為noip2011day2第二題,可能很多人不會的原因是因為公式看不懂,先解釋一下,yi的公式是指(符合條件的j的總數)*(vj的和)。現在我們來分析一下題目。題目中說,讓我們找乙個合適的w的值使得yi的和與給定的s之差的絕對值最小。由於題目中說j的要求是區間中wi大於w的礦石,因此,我們可以確定w的範圍為minwi-1~maxwi+1。在minwi-1以下的與minwi-1的值相同(全部可以取),同理,maxwi+1以上的與maxwi的值相同(全部不能取)。由於題目中說s-y的絕對值最小,因此我們可以肯定y可能》s也可能s,我們就往右邊的區間找,否則往左邊的區間找,50分就到手了。

剩下的50分需要用到乙個強大的技巧,也是許多區間問題中非常重要的乙個技巧,那就是字首和。當我們列舉所有礦石中wi>w的礦石的時候,用乙個陣列儲存,將所有的都算出來,這樣,在求某個區間的時候,就只要將右節點的值減去左節點-1的值,即所求的區間了,整個過程是n+m,比m*(r-l)快多了。

1

type rec=record

2w,v:int64;

3end;4

vari,j:longint;

5sum,min,w,v,n,m,s,minw,maxw,l,r,mid:int64;

6 a,b:array[0..200010] of

rec;

7 sumv,sumw:array[0..200010] of

int64;

8function

get(x:int64):int64;

9var

i,j:longint;

10begin

11 fillchar(sumv,sizeof(sumv),0

);12 fillchar(sumw,sizeof(sumw),0

);13 get:=0;14

for i:=1

to n do

15if a[i].w>x then

16begin

17 sumv[i]:=sumv[i-1]+a[i].v;

18 sumw[i]:=sumw[i-1]+1;19

end20

else

21begin

22 sumv[i]:=sumv[i-1

];23 sumw[i]:=sumw[i-1

];24

end;

25for j:=1

to m do

26 inc(get,(sumw[b[j].v]-sumw[b[j].w-1])*(sumv[b[j].v]-sumv[b[j].w-1

]));

27end;28

begin

29 minw:=maxlongint;

30readln(n,m,s);

31for i:=1

to n do

32with a[i] do

33begin

34readln(w,v);

35if w>maxw then

36 maxw:=w;

37if wthen

38 minw:=w;

39end;40

for i:=1

to m do

41with b[i] do

42readln(w,v);

43 l:=minw-1

;44 r:=maxw+1

;45 min:=9223372036854775800;46

repeat

47 mid:=(l+r) div2;

48 sum:=get(mid);

49if abs(sum-s)then

50 min:=abs(sum-s);

51if sum>s then

52 l:=mid+1

53else

54 r:=mid-1;55

until l>r;

56writeln(min);

57end.

codevs 1138 聰明的質監員

codevs 1138 聰明的質監員 小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是 見圖 若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批...

codevs1138 聰明的質監員

題目描述 description 小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是 見圖 若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批礦產...

聰明的質監員(codevs 1138)

題目描述 description 小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是 見圖 若這批礦產的檢驗結果與所給標準值s 相差太多,就需要再去檢驗另一批礦產。小t不想費時間去檢驗另一批礦產...