ZCMU 1059: 田忌赛马

本文解析了田忌赛马问题,通过贪心算法找出田忌最多能赢得多少银子的策略。输入包括双方马匹的速度,输出为田忌最大盈利。文章提供了两种实现方案并解释了贪心策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description


田忌和齐王赛马,两人各出n匹马,赢一场比赛得200两银子,输了赔200银子,平局不赔不赚.已知两人每匹马的速度,问田忌最多能赢多少银子.

Input


多组测试数据,
每组数据的第一行是一个整数n。 (1<=n<=1000)
第二行包括n个整数既田忌每匹马的速度.
第三行包括n个整数既齐王每匹马的速度.
每匹马的速度不超过1000.

Output

对于每组数据输出一行有一个整数代表田忌最多能赢多少银子
Sample Input

92 83 71  
95 87 74 

20 20 
20 20 

20 19 
22 18 
Sample Output
200
0
0

参考博客https://blog.youkuaiyun.com/qq_41489727/article/details/80410707

              https://blog.youkuaiyun.com/qq_38735931/article/details/81190585

【思路】贪心方法:

1.当田忌最慢的马比齐王最慢的马快,赢一场先

2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场
3.当田忌最快的马比齐王最快的马快时,赢一场先。
4.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。
5.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比.

​#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int a[maxn],b[maxn];
bool cmp(int a,int b){//降序 
    return a>b;
}
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int i,j,lena,lenb;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		for(i=0;i<n;i++)
			scanf("%d",&b[i]);
		sort(a,a+n,cmp);//降序排列 
		sort(b,b+n,cmp);
		i=0;j=0;int sum=0;
		lena=lenb=n-1;
		for(i,j;i<=lena;)
		{
			if(a[lena]>b[lenb]){//如果田忌最慢的马比齐王最慢的马快,那么赢一场。
				sum++;
				lena--;
				lenb--;
			}
			else if(a[i]>b[j]){ //如果田忌最快的马比齐王最快的马快,也赢一场 
				sum++;
				i++;
				j++;
			}
			else{//.如果田忌最慢的马比齐王最慢的马慢或者最快的比最快的慢,那么田忌最慢的干齐王最快的,这样肯定会输,除了相等的情况。 
				if(a[lena]!=b[j])sum--;
				lena--;j++;
			}
		}
		cout<<sum*200<<endl;
	}
	return 0;
}
​
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int a[maxn],b[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        int ans = 0;
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n;i++) scanf("%d",&b[i]);
        sort(a,a+n); 
        sort(b,b+n);
        int f=0,q=n-1;
        int j=0;
        for(int i=n-1;i>=j;i--)
        {
            if(a[q]<=b[i])//最快的马比齐王的慢或打平,则比较最慢的马
            {
                while(a[f]>b[j]) //最慢的马和齐王的最慢的马比较
                {
                    ans +=200;
                    f++; j++;
                }
                                 //最慢的马和齐王最快的马比较

                if(a[f]<b[i]) 
                ans-=200;
                f++;
            }
            else { q--; ans+=200; }//最快的马比齐王快,ans+100
        }
        printf("%d\n",ans);
    }
}

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关最求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值