原题传送:http://poj.org/problem?id=2287
贪心算法:
1. 田忌要尽可能用最慢的马去赢齐王最快的马。
2. 能赢就赢。
一开始我不是这么想的,我是用田忌最快的马和齐王最快的马比较,如果田忌慢,那么换田忌最慢的马和谐掉齐王最快的马,那么田忌剩下的马赢的次数就能多点。但是这种想法是错的,这样过不了下面这组测试数据:
3
5 5 3
5 4 2
答案:400
View Code
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #define MAXN 1005 5 6 int a[MAXN], b[MAXN]; 7 8 bool cmp(int x, int y){return x > y;} 9 10 int main() 11 { 12 int i, n, sum, k, al, ar, bl, br; 13 while(scanf("%d", &n), n) 14 { 15 for(i = 0; i < n; i ++) 16 scanf("%d", &a[i]); 17 for(i = 0; i < n; i ++) 18 scanf("%d", &b[i]); 19 std::sort(a, a + n, cmp); 20 std::sort(b, b + n, cmp); 21 k = sum = 0; 22 al = bl = 0, ar = br = n - 1; 23 while(al <= ar) 24 { 25 if(a[ar] > b[br]) 26 { 27 sum ++; 28 ar --, br --; 29 } 30 else if(a[al] > b[bl]) 31 { 32 sum ++; 33 al ++, bl ++; 34 } 35 else if(a[al] <= b[bl]) 36 { 37 if(a[ar] < b[bl]) 38 k ++; 39 ar --, bl ++; 40 } 41 } 42 printf("%d\n", 200 * (sum - k)); 43 } 44 return 0; 45 }
后来想想,怎么好像是动态规划题啊。