这是本人发的第一个题解,有什么不合适之处,欢迎指出。
第一次发题解,当然要做简单的啦,直接安排上洛谷的GESP四级题——田忌赛马(B3928)
题目描述
你要和田忌赛马。你们各自有 N 匹马,并且要进行 N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。
你的马匹的速度分别为 u1,u2,⋯,un,田忌的马匹的速度分别为 v1,v2,⋯,vn。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
输入格式
第一行一个整数 N。保证 1≤N≤5×104
接下来一行 N 个用空格隔开的整数,依次为 u1,u2,⋯,un,表示你的马匹们的速度。保证 1≤ui≤2N。
接下来一行 N 个用空格隔开的整数,依次为 v1,v2,⋯,vn,表示田忌的马匹们的速度。保证 1≤vi≤2N。
输出格式
输出一行,表示你最多能获胜几轮。
代码展示
好的,咱们正话不多说,废话不少说,也是直接奉上代码好吧。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,a[114514],b[114514],s=0;
bool x[114514]={0};
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a,a+n);
sort(b,b+n); //从最慢的马开始比,尽量让慢马变得有用
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[j]>b[i]&&x[j]==0){
s++;
x[j]=1; //表示此马已上场
break;
}
cout<<s;
}
优化
但是,这还是不够快。于是,我选择了优化。
以下是优化后的代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,a[114514],b[114514],s=0,m=0;
bool x[114514]={0};
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a,a+n);
sort(b,b+n); //从最慢的马开始比,尽量让慢马变得有用
for(int i=0;i<n;i++)
for(m;m<n;m++) //既然第(我的)m匹马都勉强跑过(田忌的)第i匹马,那前面差的马就没必要比了
if(a[m]>b[i]&&x[m]==0){
s++;
x[m]=1; //表示此马已上场
break;
}
cout<<s;
}
当然,代码仅供参考,请勿抄袭。
好了,今天就扯到这儿,我们下次再聊。