中石油 玩小游戏

听完了故事,小 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 想知道他最多能够获得多少分?

输入

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

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

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

输出

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

样例输入
4
5 3 2 16 14 13 9 7
1 8 12 11 15 6 4 10
样例输出
7

大体的意思就是俩人比较大小,前一半是小的获胜,后一半是大的获胜。
鄙人的想法是将小X的进行排序,因为比小的肯定是小的好,比大的肯定是越大越好。再将电脑两边的数字分别进行排序。
让比较的时候,大的那个数移动,分别和另一个数比较。
比如以前一半比小的获胜为例
1 2 3 4 5 小X
6 7 8 9 10 电脑
这种情况是最简单的,直接就可以比出来小X全胜
2 3 5 9
1 8 11 12
这种情况的话 先比较2 1 ,2大于1,保留,继续用2和1的下一位比较 也就是8,
以此类推,因为这个数列都是有序的,每次都是大的数在不断移动,而小的数的移动取决于是否满足它小于大的数。

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,a[3000],b[3000],ans,cnt=1;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n*2;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n*2;i++)
        scanf("%d",&b[i]);
    sort(b+1,b+n+1);//电脑的前一半数字
    sort(b+n+1,b+n*2+1);//电脑的后一半数字
    sort(a+1,a+1+n*2);//小X的数字
    for(int i=1;i<=n;i++)//前一半数字比较,小X的数字要作为小的那个数
        if(a[cnt]<b[i]) ans++,cnt++;
    cnt=n+1;
    for(int i=n+1;i<=n*2;i++)//后一半数字比较,电脑的数字要作为小的那个数
        if(a[i]>b[cnt]) ans++,cnt++;
    printf("%d",ans);
     
     
     
    return 0;
}
发布了43 篇原创文章 · 获赞 1 · 访问量 1590

猜你喜欢

转载自blog.csdn.net/DaNIelLAk/article/details/103623809