视频讲解:B3928 [GESP202312 四级] 田忌赛马
一、原题
题目描述
你要和田忌赛马。你们各自有 N 匹马,并且要进行 N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。
你的马匹的速度分别为 u_1,u_2,...,u_n,田忌的马匹的速度分别为 v_1,v_2,...,v_n。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
输入格式
第一行一个整数 N。保证 1<= N <= 5* 10^4
接下来一行 N 个用空格隔开的整数,依次为 u_1,u_2,...,u_n,表示你的马匹们的速度。保证 1<= u_i<= 2N。
接下来一行 N 个用空格隔开的整数,依次为 v_1,v_2,...,v_n,表示田忌的马匹们的速度。保证 1<= v_i<= 2N。
输出格式
输出一行,表示你最多能获胜几轮。
输入输出样例
输入 #1
3
1 3 5
2 4 6
输出 #1
2
输入 #2
5
10 3 5 8 7
4 6 1 2 9
输出 #2
5
说明/提示
第 1 轮,田忌派出速度为 2 的马匹,你可以派出速度为 3 的马匹迎战,本轮你获胜。
第 2 轮,田忌派出速度为 4 的马匹,你可以派出速度为 5 的马匹迎战,本轮你获胜。
第 3 轮,田忌派出速度为 6 的马匹,你可以派出速度为 1 的马匹迎战,本轮田忌获胜。
如此,你可以赢得 2 轮比赛。
二、做题思路
1)填充数据
2)排序
3)贪心比较(尽可能用自己速度慢的马赢得田忌的马
4)输出结果
三、答案
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
//1)填充数据
//1.1)确定马的数量
int n;
cin>>n;
//1.2)填充自己的马匹速度
int u[50005];
for(int i=1;i<=n;i++) cin>>u[i];
//1.3)填充田忌的马匹速度
int v[50005];
for(int i=1;i<=n;i++) cin>>v[i];
//2)排序(升序)
sort(u+1,u+n+1);
sort(v+1,v+n+1);
//3)贪心比较(尽可能用自己速度慢的马赢得田忌的马)
int ans=0;
int j=1;
for(int i=1;i<=n;i++){
if(u[i]>v[j]){
ans++;//胜利次数+1
j++;//田忌的马后移
}
}
//4)输出结果
cout<<ans;
}