杭电 ACM Step(3)
2018-04-01 10:10
615 查看
Tian Ji – The Horse Racing
题目求解
让田忌最慢的马和齐王最慢的马相比,如果田忌最慢的马比齐王最慢的马快,先让田忌赢一场。因为在这种情况下,田忌所有的马都比齐王最慢的马快,所以用一个最慢的马和齐王最慢的马比,减少田忌的损耗。如果田忌最慢的马比齐王最慢的马慢,则用田忌最慢的马和齐王最快的马相比,让田忌输一场。在这种情况下,田忌用最慢的马拼掉齐王最快的马。
当田忌最慢的马和齐王最慢的马速度一样时
如果田忌最快的马比齐王最快的马快,先让田忌赢一场
田忌最快的马比齐王最快的马慢,用田忌最慢的马与齐王最快的马比,田忌输一场。
田忌和齐王最快的马一样快时
田忌最慢的马比齐王最快的马慢,则先让田忌输一场
其余情况则说明田忌和齐王还未安排比赛的所有的马的速度都一样。所以田忌不输不赢。
总体思想
贪心算法:局部最优,你的每一步都是最优的,不需要遍历全部找最优。实现代码
#include <stdio.h> void SelectSort(int s[],int N) { int flag; int t; for(int i=0;i<N;i++) { flag=i; for(int j=i+1;j<N;j++) { if(s[j]<s[flag]) flag=j; } t=s[i]; s[i]=s[flag]; s[flag]=t; } } int main() { int T; int A[1000]; int B[1000]; while(scanf("%d",&T),T) { for(int i=0;i<T;i++) scanf("%d",&A[i]); for(int i=0;i<T;i++) scanf("%d",&B[i]); SelectSort(A,T); SelectSort(B,T); int win=0; int k=T-1; int j=0; for(int i=0;i<T;) { if(A[i]>B[j]) //如果A最慢的马比B最慢的马快,先让A赢一局 { i++;//A和B最慢的马都提高一个档次 j++; win++; } else if(A[i]<B[j])//如果A最慢的马比B最慢的马慢,和B最快的马比,A输一场 { k--;//B最快的马降低一个档次 i++;//A最慢的马提高一个档次 win--; } else //A和B最慢的马一样慢 { if(A[T-1]>B[k])//A最快的马比B最快的马快时,A赢一场 { win++; T--;//A最快的马变为次一档 k--;//B最快的马变为次一档 } else if(A[T-1]<B[k]) //A最快的马比B最快的马慢时,A用最慢的马和B最快的马比,输一场 { win--; k--;//B最快的马降低一个档次 i++;//A最慢的马提高一个档次 } else//A和B最快的马一样快,A最慢的马和B最快的马比,输一场 { if(A[i]<B[k]) win--; i++;//其余情况则表明A所有的马都一样快了 //则A最慢的马和B最快的马速度一样,不输不赢 k--; } } } printf("%d\n",win*200); } return 0; }
相关文章推荐
- 杭电 ACM Step(3)
- 杭电ACM_step1.2.1
- 杭电 acm step 1.3.1 Moving Tables
- 杭电 acm step 1.3.7 As Easy As A+B
- 杭电acm step 1.3.8 Who's in the Middle
- 杭电acm step 1.3.6 Rank
- 杭电acm step 动态规划专题总结(1)简单的动态规划问题
- 杭电acm_step1.2.2
- 杭电OJ acm_step1.1.2
- 杭电ACM Step 纪念
- 杭电ACM ACMStep1.3.2
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- 杭电acm 2056
- 杭电ACM 2050折线分割平面
- 杭电 acm 1181 To The Max
- 杭电ACM_1010_搜索题
- 杭电acm--2013
- 杭电ACM 1.2.6 IBM Minus One
- 杭电ACM 2026 首字母变大写
- 杭电ACM刷题(1):1002,A + B Problem II