1. 程式人生 > >JZOJ_100029. 【NOIP2017提高A組模擬7.8】陪審團 (Standard IO)

JZOJ_100029. 【NOIP2017提高A組模擬7.8】陪審團 (Standard IO)

qsort sta begin tput 關心 關鍵字 int 最有 制度

Description

陪審團制度歷來是司法研究中的一個熱議話題,由於陪審團的成員組成會對案件最終的結果產生巨大的影響,訴訟雙方往往圍繞陪審團由哪些人組成這一議題激烈爭奪。 小 W 提出了一個甲乙雙方互相制衡的陪審團成員挑選方法:假設共有 n 名候選陪審團成員,則由甲先提名 s 位候選人,再由乙在甲提名的 s 位候選人中選出 t 名,作為最終的陪審團成員。顯然這裏應當有n ≥ s ≥ t。假設候選人 k 對甲、乙的有利程度都可以用一個二元組(????, ????)來表示,????越大說明候選人 k 對甲越有利,????越大則對乙越有利。在此前提下,雙方的目標都變得明確:甲要最大化最終陪審團 t 人的 x 之和,最小化 y之和,乙則反之。 現在甲方決定聘請你為律師,並且事先得知了乙方律師的策略:乙方律師會在你提名的 s 名候選人中選出 t 名使得這 t 人的 y 值之和最大,再保證 y 值之和最大的前提下使得 x 值之和盡量小(在對乙方最有利的前提下對甲方最不利)。 現在你應當慎重地提名 s 位候選人使得最終由乙方律師確定的 t 人 x 值和最大,若有多種方案,則應再使被乙方排除掉的 s-t人的 y 值和盡量大,在此基礎上最大化 s 人的 x 值 之和,在此基礎上最小化 s 人的 y 值 之和。 你的當事人並不關心你提名的具體是哪些人,只要你告訴他你提名的 s 人的 x 值之和 與 y 值之和。

Input

第一行包含三個整數 n,s,t。 接下來 n 行,每行兩個整數分別表示????, ????。

Output

共一行兩個整數,分別為 x 值之和與 y 值之和。

Solution

若甲方只能選t名,那乙方就別無選擇了。那甲方選s名,乙方是否能也別無選擇的選t名呢?

是能的!

首先,將yk從小到大排序(第一次),去後(n-s+t)名。

那麽甲方在後面無論怎麽選t名,乙方也只能選這t名,因為都比前(s-t)名對乙方的貢獻大。

因為要使對甲方的貢獻最大,那麽在將後(n-s+t)名以xk為關鍵字從大到小排序(第二次),選前t名。

因為還要求(s-t)名對乙方的貢獻盡量大,在將出去t名的序列以yk為關鍵字從大到小排序(第三次)。

只要第三次排序的序列的yk值不比所選的t名的最小的yk值大,就可以選,選完(s-t)個即可。

代碼

  1 var
  2   ansx,ansy:int64;
  3   n,s,t:longint;
  4   xk,yk,a,b:array [0..100001] of longint;
  5 procedure init;
  6 var
  7   i:longint;
  8 begin
  9   readln(n,s,t);
 10   for i:=1
to n do 11 readln(xk[i],yk[i]); 12 end; 13 14 procedure qsort1(l,r:longint); 15 var 16 i,j,mid1,mid2,tk:longint; 17 begin 18 if l>r then exit; 19 i:=l; j:=r; 20 mid1:=yk[(l+r) div 2]; 21 mid2:=xk[(l+r) div 2]; 22 repeat 23 while (yk[i]<mid1) or (yk[i]=mid1) and (xk[i]>mid2) do inc(i); 24 while (yk[j]>mid1) or (yk[j]=mid1) and (xk[j]<mid2) do dec(j); 25 if i<=j then 26 begin 27 tk:=xk[i]; xk[i]:=xk[j]; xk[j]:=tk; 28 tk:=yk[i]; yk[i]:=yk[j]; yk[j]:=tk; 29 inc(i); dec(j); 30 end; 31 until i>j; 32 qsort1(i,r); 33 qsort1(l,j); 34 end; 35 36 procedure qsort2(l,r:longint); 37 var 38 i,j,mid1,mid2,tk:longint; 39 begin 40 if l>r then exit; 41 i:=l; j:=r; 42 mid1:=xk[(l+r) div 2]; 43 mid2:=yk[(l+r) div 2]; 44 repeat 45 while (xk[i]>mid1) or (xk[i]=mid1) and (yk[i]>mid2) do inc(i); 46 while (xk[j]<mid1) or (xk[j]=mid1) and (yk[j]<mid2) do dec(j); 47 if i<=j then 48 begin 49 tk:=xk[i]; xk[i]:=xk[j]; xk[j]:=tk; 50 tk:=yk[i]; yk[i]:=yk[j]; yk[j]:=tk; 51 inc(i); dec(j); 52 end; 53 until i>j; 54 qsort2(i,r); 55 qsort2(l,j); 56 end; 57 58 procedure qsort3(l,r:longint); 59 var 60 i,j,mid1,mid2,tk:longint; 61 begin 62 if l>r then exit; 63 i:=l; j:=r; 64 mid1:=b[(l+r) div 2]; 65 mid2:=a[(l+r) div 2]; 66 repeat 67 while (b[i]>mid1) or (b[i]=mid1) and (a[i]>mid2) do inc(i); 68 while (b[j]<mid1) or (b[j]=mid1) and (a[j]<mid2) do dec(j); 69 if i<=j then 70 begin 71 tk:=a[i]; a[i]:=a[j]; a[j]:=tk; 72 tk:=b[i]; b[i]:=b[j]; b[j]:=tk; 73 inc(i); dec(j); 74 end; 75 until i>j; 76 qsort3(i,r); 77 qsort3(l,j); 78 end; 79 80 procedure main; 81 var 82 i,num,min,tk:longint; 83 begin 84 ansx:=0; ansy:=0; num:=0; 85 qsort1(1,n); 86 for i:=1 to s-t do 87 begin 88 inc(num); 89 a[num]:=xk[i]; b[num]:=yk[i]; 90 end; 91 qsort2(s-t+1,n); 92 min:=maxlongint; 93 for i:=s-t+1 to s do 94 begin 95 ansx:=ansx+xk[i]; 96 ansy:=ansy+yk[i]; 97 if yk[i]<min then min:=yk[i]; 98 end; 99 for i:=s+1 to n do 100 begin 101 inc(num); 102 a[num]:=xk[i]; b[num]:=yk[i]; 103 end; 104 qsort3(1,num); 105 tk:=0; 106 for i:=1 to num do 107 if b[i]<=min then 108 begin 109 inc(tk); 110 ansx:=ansx+a[i]; 111 ansy:=ansy+b[i]; 112 if tk=s-t then break; 113 end; 114 writeln(ansx, ,ansy); 115 end; 116 117 begin 118 init; 119 main; 120 end.

JZOJ_100029. 【NOIP2017提高A組模擬7.8】陪審團 (Standard IO)