题目描述
你要和田忌赛马。你们各自有 NN 匹马,并且要进行 NN 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。
你的马匹的速度分别为 u_1,u_2,\cdots,u_nu1,u2,⋯,un,田忌的马匹的速度分别为 v_1,v_2,\cdots,v_nv1,v2,⋯,vn。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
输入格式
第一行一个整数 NN。保证 1\le N \le 5\times 10^41≤N≤5×104
接下来一行 NN 个用空格隔开的整数,依次为 u_1,u_2,\cdots,u_nu1,u2,⋯,un,表示你的马匹们的速度。保证 1\le u_i\le 2N1≤ui≤2N。
接下来一行 NN 个用空格隔开的整数,依次为 v_1,v_2,\cdots,v_nv1,v2,⋯,vn,表示田忌的马匹们的速度。保证 1\le v_i\le 2N1≤vi≤2N。
输出格式
输出一行,表示你最多能获胜几轮。
输入输出样例
输入
3 1 3 5 2 4 6
输出
2
输入
5 10 3 5 8 7 4 6 1 2 9
输出
5
说明/提示
样例解释 1
第 1 轮,田忌派出速度为 2 的马匹,你可以派出速度为 3 的马匹迎战,本轮你获胜。
第 2 轮,田忌派出速度为 4 的马匹,你可以派出速度为 5 的马匹迎战,本轮你获胜。
第 3 轮,田忌派出速度为 6 的马匹,你可以派出速度为 1 的马匹迎战,本轮田忌获胜。
如此,你可以赢得 2 轮比赛。
一道GESP四级的真题,我第一反应是,太简单了。
#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],b[100005];
int main(){
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1); //a数组排序
sort(b+1,b+n+1); //b数组排序
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i]>b[j] && a[i]!=0 && b[j]!=0){
a[i]=0;
b[j]=0;
sum++;
}
}
}
cout<<sum;
return 0;
}
然后.......90分(TLE)
于是我大脑飞速运转
发现,还是会觉得很简单
首先
先排序
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1); //a数组排序
sort(b+1,b+n+1); //b数组排序
然后用a数组的值和b数组的值一个一个比
第一步:用1,看有没有比1小的。
第二步:用3,这里发现3>2,sum++。(sum为计数器)
于是3和2都标记(绿色为标记)
第三步:用5,用5时,发现b数组的2已经被标记了
于是2不算是b数组的值,从4开始寻找。
又发现5>4,sum++。(sum为计数器)
第四步:发现a数组已经扫描完了,程序结束,输出sum。
最后是完整代码:
注意,这里代码有小问题,要把数组按题目开大一点(防止有人直接不动脑子抄代码)。
#include<bits/stdc++.h>
using namespace std;
long long n,a[10005],b[10005];
int main(){
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1);
int j=1;
for(int i=1;i<=n;i++){
if(a[i]>b[j]){
sum++;
j++;
}
}
cout<<sum;
return 0;
}
标签:GESP202312,int,sum,long,数组,马匹,B3928,田忌,田忌赛马
From: https://blog.csdn.net/zzzoureiojg/article/details/141784057