POJ 2287 田忌赛马 贪心算法
田忌赛马,大致题意是田忌和国王赛马,赢一局得200元,输一局输掉200元,平局则财产不动。
先输入一个整数N,接下来一行是田忌的N匹马,下一行是国王的N匹马。当N为0时结束。
此题为贪心算法解答,有两种思路。
思路二:
1、开始也是先排序,可以使用sort快排;
2、然后将田忌最大的马与国王进行比较;
3、如果田忌最大的马大于国王,那么就胜场++;
4、如果田忌最大的马小于国王,那么就一定会输,所以用田忌最小的马输给国王最大的马;
5、如果田忌最大的马等于国王,那么就比较最小的马;
5。1、如果田忌最小的马大于国王,那么胜场++;
5。2、如果田忌最小的马小于国王,那么就输给国王;
5。3、如果田忌最小的马等于国王,就用田忌最小的马对国王最大的马,如果国王最大的马大,那么财产要减200;
const int Max = 1050; bool cmp(int a,int b) { return a > b; } int pk2() { int tian[Max],king[Max]; int i,j,n,m; while(cin >> n) { if(n == 0) break; for(i=1; i<=n; i++) { cin >> tian[i]; } for(i=1; i<=n; i++) { cin >> king[i]; } sort(tian+1,tian+1+n,cmp); sort(king+1,king+1+n,cmp); int ans = 0; int ii,jj; for(i=1, j=1, ii=n, jj=n; i<=ii; ) { if(tian[i] > king[j]) { ans += 100; i++,j++; } else if(tian[i] < king[j]) { ans -= 100; j++,ii--; } else { if(tian[ii] > king[jj]) { ans += 100; ii--,jj--; } else { if(tian[ii] < king[j]) ans -= 100; ii--,j++; } } } cout << ans << endl; } return 0; } int main() { pk2(); return 0; }
参考:
http://blog.163.com/zhaoyuan_sue/blog/static/20868323120125280842774/