田忌赛马Tian Ji -- The Horse Racing(hdu 1052)

来源:互联网 发布:淘宝店海报怎么做 编辑:程序博客网 时间:2024/06/06 01:42
刚开始用二分图的最大匹配,超时了。
二分图最大分配代码:
<pre name="code" class="cpp">#include<stdio.h>#include<string.h>int n;int tian[1005],king[1005];int path[1005][1005];int link[1005];int used[1005];int dfs(int t){for(int i=0;i<n;i++){if(used[i]==0 && path[t][i]==1){used[i] = 1;if(link[i]==-1 || dfs(link[i])){link[i] = t;return 1;}}}return 0;}int maxmatch(){int ans = 0;memset(link, -1, sizeof(link));for(int i=0;i<n;i++){memset(used, 0, sizeof(used));ans += dfs(i);}int eq = 0;memset(used, 0, sizeof(used));for(int i=0;i<n;i++){int flag = 1;for(int j=0;j<n;j++){if(path[i][j]==2 && used[j]==0){if(link[j]!=i){eq++;used[j] = 1;break;}}}}//printf("%d\n", eq);return 2*ans-n+eq;}int main(){while(scanf("%d", &n), n){memset(tian, 0, sizeof(tian));memset(king, 0, sizeof(king));memset(path, 0, sizeof(path));for(int i=0;i<n;i++){scanf("%d", &tian[i]);}for(int i=0;i<n;i++){scanf("%d", &king[i]);}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(tian[i]>king[j]){path[i][j] = 1;}if(tian[i]==king[j]){path[i][j] = 2;}}}printf("%d\n", maxmatch()*200);}return 0;}


 
 
 
后来看了网上的代码,采用的是贪心算法,
1.当田忌最慢的马比齐王最慢的马快,赢一场先
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场
3. 如果 = = 
one.当田忌最快的马比齐王最快的马快时,赢一场先。
two.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。
three.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比.
 
代码如下:
#include<stdio.h>int tian[1005],king[1005];int n;void sort(int s[], int n){int tmp,k;for(int i=0;i<n;i++){k = i;for(int j=i;j<n;j++){if(s[k]>s[j]){k = j;}}if(k!=i){tmp = s[k];s[k] = s[i];s[i] = tmp;}}}int main(){while(scanf("%d", &n), n){for(int i=0;i<n;i++){scanf("%d", &tian[i]);}for(int i=0;i<n;i++){scanf("%d", &king[i]);}sort(tian, n);sort(king, n);int win = 0;int k = n-1;int j = 0;for(int i=0;i<n;){if(tian[i]>king[j]){i++;j++;win++;}else if(tian[i]<king[j]){k--;i++;win--;}else{if(tian[n-1]>king[k]){n--;k--;win++;}else if(tian[n-1]<king[k]){i++;k--;win--;}else{if(tian[i]<king[k]){win--;}i++;k--;}}}printf("%d\n", win*200);}return 0;}


0 0