刚开始用二分图的最大匹配,超时了。
二分图最大分配代码:
后来看了网上的代码,采用的是贪心算法,
1.当田忌最慢的马比齐王最慢的马快,赢一场先
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场
3. 如果 = = 则
one. 当田忌最快的马比齐王最快的马快时,赢一场先。
two. 当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。
three. 当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比 .
代码如下:
二分图最大分配代码:
<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;
}