【习题解析】田忌赛马

题目:田忌赛马

题目来源:2023 年 12 月 CCF GESP C++ 四级
编程题 第二题

田忌赛马
题目描述:
你要和田忌赛马。你们各自有N匹马,并且要进行N轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。
你的马匹的速度分别为 u 1 , u 2 , u 3 , . . . , u n u_1,u_2,u_3,...,u_n u1,u2,u3,...,un,田忌的马匹的速度分别为 v 1 , v 2 , v 3 , . . . v n v_1,v_2,v_3,...v_n v1,v2,v3,...vn
田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?
巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
输入:
第一行一个整数 N。保证 1 < = N < = 5 × 1 0 4 1<=N<=5\times 10^4 1<=N<=5×104
接下来一行 N 个用空格隔开的整数,依次为 u 1 , u 2 , u 3 , . . . , u n u_1,u_2,u_3,...,u_n u1,u2,u3,...,un,表示你的马匹们的速度。保证 1 < = u i < = 2 N 1<=u_i<=2N 1<=ui<=2N
接下来一行 N 个用空格隔开的整数,依次为 v 1 , v 2 , v 3 , . . . , v n v_1,v_2,v_3,...,v_n v1,v2,v3,...,vn,表示田忌的马匹们的速度。保证 1 < = v i < = 2 N 1<=v_i<=2N 1<=vi<=2N
输出:
输出一行,表示你最多能获胜几轮。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1
3
1 3 5
2 4 6
样例输出 1
2
样例解释 1
第 1 轮,田忌派出速度为 2 的马匹,你可以派出速度为 3 的马匹迎战,本轮你获胜。
第 2 轮,田忌派出速度为 4 的马匹,你可以派出速度为 5 的马匹迎战,本轮你获胜。
第 3 轮,田忌派出速度为 6 的马匹,你可以派出速度为 1 的马匹迎战,本轮田忌获胜。
如此,你可以赢得 2 轮比赛。
样例输入 2
5
10 3 5 8 7
4 6 1 2 9
样例输出 2
5

题目分析

第一步:先完成输入部分。
由题输入一个整数 N,代表马匹数和比赛轮数, 1 < = N < = 5 × 1 0 4 1<=N<=5\times 10^4 1<=N<=5×104,数据范围在 int 内。

int N;
cin>>N;

接下来进行马匹速度的输入,数据范围一样在 int 内,并且数据较多,因此优先选择数组。

int w[100010];//我的马
int t[100010];//田忌的马

对数据进行输入。

for(int i=1;i<=N;i++)
{
	cin>>w[i];//输入我的马
}
for(int i=1;i<=N;i++)
{
	cin>>t[i];//输入田忌的马
}

输入已完成!
分析题目,要输出我能获胜最多,因为只能比一次,并且马匹数都是一样的,所以可以使用贪心进行匹配,在每一轮的比赛中,选择能够战胜田忌当前马匹的速度最小的马匹。
如果找不到能够胜利的马匹,不做统计即可。
而要实现比较,因此需要将两个速度进行排序,直接使用 sort 进行排序,要记得添加#include<algorithm>头文件哦~

sort(w+1,w+N+1);//因为输入从1开始,所以w+1,排n个数据
sort(t+1,t+N+1);

排好序之后,就可以进行比较啦!

int b=1;//田忌的马开始排序
int ans=0;//统计胜利次数
for(int i=1;i<=N;i++)
{
	if(w[i]>t[b])//田忌的马需要从1开始一个个的比较
	{
		ans++;//我的马速度快,就进行比较,加一次胜利
		b++;//胜利就移到田忌的下一匹马
	}
}

最后只需要将 ans 输出即可。
完整代码如下:

#include<iostream>
#include<algorithm> 
using namespace std;
int w[100010];//我的马
int t[100010];//田忌的马
int main()
{
	int N;
	cin>>N; 
	
	for(int i=1;i<=N;i++)
	{
		cin>>w[i];//输入我的马
	}
	for(int i=1;i<=N;i++)
	{
		cin>>t[i];//输入田忌的马
	}
	sort(w+1,w+N+1);//因为输入从1开始,所以w+1,排n个数据
	sort(t+1,t+N+1);
	int b=1;//田忌的马开始排序
	int ans=0;//统计胜利次数
	for(int i=1;i<=N;i++)
	{
		if(w[i]>t[b])//田忌的马需要从1开始一个个的比较
		{
			ans++;//我的马速度快,就进行比较,加一次胜利
			b++;//胜利就移到田忌的下一匹马
		}
	}
	cout<<ans;
	return 0;
}

以上即解决该题!

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员莫小特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值