B3928 [GESP202312 四级] 田忌赛马

题目描述

你要和田忌赛马。你们各自有 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值