题目:田忌赛马
题目来源: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;
}
以上即解决该题!