【基础】小 X 玩游戏(game)

【基础】小 X 玩游戏(game)

Description

听完了故事,小 X 又想去玩一会儿游戏了。 这是一个很奇特的单机游戏, 游戏规则如下:

游戏中一共有 4× n 张牌,每张牌上有一个数字, 这些数字恰好是 1~4× n。一开始电脑会把这 4× n张牌随机打乱,然后会发 2× n 张牌给小 X。那些剩下的 2× n 牌电脑会再打乱一次,然后排成一排展示给小 X 看。而小 X 需要做的就是将自己的 2× n 张牌也排成一排,与电脑展示的 2× n 张牌一一对应。

之后就开始评分了,对于前 n 对牌(一对牌是指小 X 的一张加上电脑的一张), 牌上数字小的一方获得一分; 而对于后 n 对牌, 牌上数字大的一方获得一分。

例 如当 n=3 时, 共 有 12 张牌 , 牌 上的数字是 1 ~ 12 。 电脑打乱 后,小 X 拿到 6 张牌 , 假设 是1, 3, 4, 5, 7, 8。 此时电脑手中还剩下 2, 6,9, 10, 11, 12。同样假设电脑会将这 6 张牌按照 9, 11, 6, 2, 12, 10 这样的顺序展示给小 X 看。如果小 X 是将 6 张牌按 1, 7, 5, 8, 4, 3 这么排的,那么小 X 会获得 4 分。

第 1 对: 1 – 9 ,小 X 得 1 分, 电脑得 0 分

第 2 对: 7 –  11,小 X 得 1 分, 电脑得 0 分

第 3 对: 5 –  6 ,小 X 得 1 分, 电脑得 0 分

第 4 对: 8 –  2 ,小 X 得 1 分, 电脑得 0 分

第 5 对: 4 –  12, 电脑得 1 分,小 X 得 0 分

第 6 对: 3 –  10, 电脑得 1 分,小 X 得 0 分

前一半第 1 对~第 3 对牌是比谁小,后一半第 4 对~第 6 对牌是比谁大。前一列数字代表的是小 X 的牌,后一列数字代表的是电脑的牌。

小 X 现在已经拿到了 2× n 张牌,同时电脑也已经展示出了它的 2× n 张牌是怎么排列的,小 X 想知道他最多能够获得多少分?

Input

输入数据第一行为一个正整数 n。

接下来一行共有 2× n 个用空格隔开的正整数, 表示小 X 手中拥有的 2× n 张牌。

再下一行同样是 2× n 个用空格隔开的正整数, 表示电脑展示出的 2× n 张牌(以读入的顺序展示)。

Output

输出一行只有一个数ans, 表示小 X 最多能够获得的分数。

Sample Input 1 

4
5 3 2 16 14 13 9 7
1 8 12 11 15 6 4 10

Sample Output 1

7

Hint

【数据范围】

对于 30% 的数据, 1 ≤ n ≤ 4

对于另外 40% 的数据, 电脑展示的 2× n 张牌是从小到大排好序的

对于 100% 的数据, 1 ≤ n ≤ 1000

来源

常州市2016“信息与未来”夏令营选拔赛

Source

市赛

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    int ar[2*n];
    int br[2*n];
    for(int i=0;i<2*n;i++)
    {
        scanf("%d",&ar[i]);
    }
    for(int i=0;i<2*n;i++)
    {
        scanf("%d",&br[i]);
    }

    sort(br,br+n);
    sort(br+n,br+2*n);  //思路把电脑牌分成前后两部分对这两部分分别进行排序,
    sort(ar,ar+2*n);    //把小X的拍直接排序,也将小X的牌分成前后两部分


    int sum_score=0;
    for(int i=n-1;i>=0;i--)     //排完序后对前一部分操作,把ar元素从最大值开始,与br的最小值元素开始进行比较,直到找到符合题意的进行次数加1,
                                //如果无符合题意的,则进行ar下一个最大元素的比较,
    {
        int flag=0;
        for(int j=0;j<n;j++)
        {
            if(ar[i]<br[j])
            {
                flag=1;
                br[j]=-1;
                break;
            }

        }
        if(flag==1)
        {
            sum_score++;
        }
    }
    for(int i=n;i<2*n;i++)  //对后一部分进行操作
    {
            int flag=0;
        for(int j=2*n-1;j>=n;j--)
        {
            if(ar[i]>br[j])
            {
                flag=1;
                br[j]=9999;
                break;
            }
        }
        if(flag==1)
        {
            sum_score++;
        }
    }

    printf("%d",sum_score);

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值