bzoj 1034[ZJOI2008]泡泡堂 - 贪心
1034: [ZJOI2008]泡泡堂BNB
Time Limit: 10 Sec Memory Limit: 162 MBDescription
第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表
队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂。每一场比赛前,对阵双方的教练向组委会提交一份
参赛选手的名单,决定了选手上场的顺序,一经确定,不得修改。比赛中,双方的一号选手,二号选手……,n号
选手捉对厮杀,共进行n场比赛。每胜一场比赛得2分,平一场得1分,输一场不得分。最终将双方的单场得分相加
得出总分,总分高的队伍晋级(总分相同抽签决定)。作为浙江队的领队,你已经在事先将各省所有选手的泡泡堂水
平了解的一清二楚,并将其用一个实力值来衡量。为简化问题,我们假定选手在游戏中完全不受任何外界因素干扰
,即实力强的选手一定可以战胜实力弱的选手,而两个实力相同的选手一定会战平。由于完全不知道对手会使用何
种策略来确定出场顺序,所以所有的队伍都采取了这样一种策略,就是完全随机决定出场顺序。当然你不想这样不
明不白的进行比赛。你想事先了解一下在最好与最坏的情况下,浙江队最终分别能得到多少分。
Input
输入的第一行为一个整数n,表示每支代表队的人数。接下来n行,每行一个整数,描述了n位浙江队的选手的
实力值。接下来n行,每行一个整数,描述了你的对手的n位选手的实力值。 20%的数据中,1<=n<=10; 40%的数
据中,1<=n<=100; 60%的数据中,1<=n<=1000; 100%的数据中,1<=n<=100000,且所有选手的实力值在0到100
00000之间。
Output
包括两个用空格隔开的整数,分别表示浙江队在最好与最坏的情况下分别能得多少分。不要在行末输出多余的
空白字符。
Sample Input
2
1
3
2
4
1
3
2
4
Sample Output
2 0
田忌赛马增强版
A的最坏情况就是B的最好情况
我们先将A,B排序
如果当前A的最强比B的最强强,那么就直接比
如果A的最弱比B的最弱强,也直接比
上面肯定是最优的
如果两个都不满足
我们就让A的最弱和B的最强比
可以自己画一画分情况讨论就明白了
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define LL long long 5 6 using namespace std; 7 8 const int MAXN = 1e5 + 10; 9 int n; 10 int l1, l2; 11 int r1, r2; 12 int A[MAXN], B[MAXN]; 13 inline LL read() 14 { 15 LL x = 0, w = 1; char ch = 0; 16 while(ch < '0' || ch > '9') { 17 if(ch == '-') { 18 w = -1; 19 } 20 ch = getchar(); 21 } 22 while(ch >= '0' && ch <= '9') { 23 x = x * 10 + ch - '0'; 24 ch = getchar(); 25 } 26 return x * w; 27 } 28 29 int ans = 0; 30 int main() 31 { 32 n = read(); 33 for(int i = 1; i <= n; i++) { 34 A[i] = read(); 35 } 36 for(int i = 1; i <= n; i++) { 37 B[i] = read(); 38 } 39 sort(A + 1, A + n + 1); 40 sort(B + 1, B + n + 1); 41 l1 = 1, r1 = n; 42 l2 = 1, r2 = n; 43 while(l1 <= r1) { 44 if(A[r1] > B[r2]) { 45 r1--, r2--; 46 ans += 2; 47 } else if(A[l1] > B[l2]) { 48 l1++, l2++; 49 ans += 2; 50 } else { 51 if(A[l1] == B[r2]) { 52 ans++; 53 } 54 r2--, l1++; 55 } 56 } 57 printf("%d ", ans); 58 ans = 0; 59 l1 = l2 = 1; 60 r1 = r2 = n; 61 while(l1 <= r1) { 62 if(B[r1] > A[r2]) { 63 r1--, r2--; 64 ans += 2; 65 } else if(B[l1] > A[l2]) { 66 l1++, l2++; 67 ans += 2; 68 } else { 69 if(B[l1] == A[r2]) { 70 ans++; 71 } 72 r2--, l1++; 73 } 74 } 75 printf("%d\n", n * 2 - ans); 76 return 0; 77 }