JZOJ100029 陪审团

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 值之和。 

Sample Input

3 2 1
2 1
3 4
5 2

Sample Output

7 3 

Data Constraint

  对于 30%的测试数据n ≤ 20
  对于 50%的测试数据n ≤ 100
  对于 100%的测试数据𝑛 ≤ 100000, 𝑥, 𝑦 ≤ 1000000

Hint

Solution

  以y值从大到小排序(第二关键字t从大到小)得到数列P,这t人必定不在倒数s-t个人中,另乙方排除掉的s-t人的y值和尽量大,在此基础上最大化s人的x值之和。

 1 #include<cstdio>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct arr
 6 {
 7     long long x,y,w;
 8 }a[100007];
 9 long long n,s,t,l,r,ma;
10 bool cmp(arr x,arr y)
11 {
12     return x.y>y.y||x.y==y.y&&x.x>y.x;
13 }
14 bool cmp2(arr x,arr y)
15 {
16     return x.x>y.x||x.x==y.x&&x.w<y.w;
17 }
18 int main()
19 {
20     scanf("%lld%lld%lld",&n,&s,&t);
21     for (int i=1;i<=n;i++)
22         scanf("%lld%lld",&a[i].x,&a[i].y);
23     sort(a+1,a+n+1,cmp);
24     for (int i=1;i<=n;i++) 
25         a[i].w=i;
26     sort(a+1,a+n-(s-t)+1,cmp2);
27     l=r=ma=0;
28     for (int i=1;i<=t;i++)
29     {
30         l+=a[i].x,r+=a[i].y;
31         if (a[i].w>ma)
32             ma=a[i].w;
33     }
34     sort(a+1,a+n+1,cmp);
35     for (int i=ma+1;i<=ma+s-t;i++)
36     {
37         l=l+a[i].x;r=r+a[i].y;
38     }
39     printf("%lld %lld\n",l,r);
40 }
View Code

 

 

 

 
posted @ 2018-08-25 09:00  kasiruto  阅读(95)  评论(0编辑  收藏