“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛 -E 赛马(经典贪心问题)

找不到题目? 戳这里

题目描述

一天小明与他同学准备赛马,他们每人有n匹马,每匹马有一个固定的战力值,战力值高的马会战胜战力值低的马并赢得比赛。每匹马只能出场比赛一次。小明偷看到了他对手每匹马的出场顺序,小明在更改自己马出场顺序后最多能赢多少场比赛。

输入描述:
输入t,代表有t组数据。每组数据输入正整数n,每人的马匹数量。下一行输入n个值a[i],代表小明每匹马的战力值。接下来一行输入n个值b[i],代表对手按顺序出场的每匹马的战力值。(t<=10, n<1000,1<=i<=n,a[i]<1e6,b[i]<1e6)

输出描述:
小明在更改马匹出场顺序后,最多能赢的场数。

示例1
输入

1
3
5 8 8
4 7 10

输出

2

这就是典型的田忌赛马问题,我们先把马儿的速度从大到小进行排序,
然后我们分三种情况进行讨论。
1 : 小明的最快的马的速度大于同学的最快的马的速度,这时候拿小明的最快的马去和同学的最快的马进行比赛。
2: 小明的最快的马的速度等于同学的最快的马的速度,然后我们这时候反正也没办法赢同学的最快的马,这时候我们就比较小明的最慢的马和同学的最慢的马的速度,如果小明的最慢的马的速度比同学的最慢的马速度慢,我们就拿小明的最慢的马去跟同学最快的马去比。
3:小明的最快的马的速度小于同学的最快的马的速度,这时候怎样都是输,就拿最慢的马去比赛。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
int a[maxn],b[maxn];
int cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        for(int i=1;i<=n;i++)
        cin>>b[i];

        sort(a+1,a+1+n,cmp);
        sort(b+1,b+1+n,cmp);

        int bg1=1,bg2=1,en1=n,en2=n,cnt=0;

        while(n--)
        {
            if(a[bg1]>b[bg2])
            {
                bg1++;
                bg2++;
                cnt++;
            }
            else if(a[bg1]==b[bg2])
            {
                if(a[en1]>b[en2])
                {
                    en1--;
                    en2--;
                    cnt++;
                }
                else
                {
                    en1--;
                    bg2++;
                }
                
            }
            else
            {
                en1--;
                bg2++;
            }
            
        }
        cout<<cnt<<endl;


    }
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值