100029. 【NOIP2017提高A组模拟7.8】陪审团
Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits
Goto ProblemSet做法:这题是一题比较绕的贪心,甲让自己最大的同时让乙没被选上的最大(意义在哪里。。。),看完题目我们可以发现,无论如何,乙
都不会选到Y值最小的S-T个人,于是我们排一遍序,将最后S-T个人排除在外的情况下选出T个x最大的,然后问题来了,我们要怎么让乙
选到这T个人?没有y值比这T个人最小的大就好了┑( ̄Д  ̄)┍。
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #define N 100007 6 #define LL long long 7 using namespace std; 8 int n, S, T; 9 LL ans_x = 0, ans_y = 0, Site = 0; 10 struct arr 11 { 12 int x, y, site; 13 }e[N]; 14 15 int cmp(arr a, arr b) 16 { 17 if (a.x == b.x) return a.site < b.site; 18 return a.x > b.x; 19 } 20 21 int Cmp(arr a, arr b) 22 { 23 if (a.y == b.y) return a.x > b.x; 24 return a.y > b.y; 25 } 26 27 int main() 28 { 29 scanf("%d%d%d", &n, &S, &T); 30 for (int i = 1; i <= n; i++) 31 scanf("%d%d", &e[i].x, &e[i].y); 32 sort(e + 1, e + n + 1, Cmp); 33 for (int i = 1; i <= n; e[i].site = i, i++); 34 sort(e + 1, e + n - S + T + 1, cmp); 35 for (int i = 1; i <= T; i++) 36 { 37 ans_x += e[i].x; 38 ans_y += e[i].y; 39 Site = Site > e[i].site ? Site : e[i].site; 40 } 41 sort(e + 1, e + n + 1, Cmp); 42 for (int i = 1; i <= S - T; i++) 43 ans_x += e[i + Site].x, ans_y += e[i + Site].y; 44 printf("%lld %lld", ans_x, ans_y); 45 }