Fork me on GitHub

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/

posted @ 2017-09-27 15:30  hellowOOOrld  阅读(3536)  评论(0编辑  收藏  举报