纸牌游戏

本文介绍了一个简单的纸牌游戏,通过预测对手出牌顺序,玩家Bessie如何利用手中牌获得最大分数。文章提供了解决问题的算法思路及代码实现。

前言
“发明负数干嘛?用来表示你的颜值与智商。”欢迎来到嘟嘟课堂。今天,我们来讲一讲暴力题——纸牌游戏。
题目描述
Bessie (胡晟智)是一头非常喜欢纸牌的奶牛,虽然她没有大拇指,但她对纸牌有近乎痴迷的喜爱。不幸的是,牛群中的其他牛都不是好的对手。他们的水平真的很差。他们总是以一种完全可预测的方式来玩纸牌!尽管如此,Bessie 仍然可以选择如何获胜。
Bessie 和她的朋友Elsie 在玩一个简单的纸牌游戏,她们拿了一付有2n 张卡片的牌,牌上的数字编号为1- 2n ,并将其均分成两份,一份卡片给Bessie 和一份卡片给Elsie。
然后两人开始玩牌,一共进行n 轮, 在每一轮中,Bessie 和Elsie 都打一张卡,谁的牌大就得一分。
神奇的Bessie 可以预测Elsie 打牌顺序,并且尽可能的想赢取胜利。请确定Bessie可以赢得的最大点数。
输入
第一行一个整数N (1≤N≤50,000).
接下来的N 行是Elsie 将每轮连续的比赛中出的牌。请注意,从这些信息很容易确定Bessie 的卡片
输出
一行给出Bessie 可以得分的最大点数。
样例输入
3
1
6
4
样例输出
2
样例说明
​贝西手上的牌是2,3,5,她按照2,3,5 的顺序出牌可以获得2 分。
思路
这道题纯属暴力。首先,我们先将渣渣对手存入a数组(读入),然后将剩余的,就是胡晟智的牌,存入b数组。然后我们来一个一个比较。设i、j两个指针。如果胡晟智的牌大于渣渣对手,就答案+1.否则i指针前移。最后输出答案即可。
代码

var
        a,b:array[1..100000] of longint;
        p:array[1..100000] of boolean;
        i,j,k,n1,n2,ans:longint;
procedure sb(l,r:longint);
var
        i,j,k,p:longint;
begin
        i:=l;
        j:=r;
        k:=a[(l+r) div 2];
        while (i<j) do
        begin
                while (a[i]>k) and (i<r) do inc(i);
                while (a[j]<k) and (l<j) do dec(j);
                if (i<=j) then
                begin
                        p:=a[i];
                        a[i]:=a[j];
                        a[j]:=p;
                        inc(i);
                        dec(j);
                end;
        end;
        if (i<r) then sb(i,r);
        if (l<j) then sb(l,j);
end;
procedure lsb(l,r:longint);
var
        i,j,k,p:longint;
begin
        i:=l;
        j:=r;
        k:=b[(l+r) div 2];
        while (i<j) do
        begin
                while (b[i]>k) and (i<r) do inc(i);
                while (b[j]<k) and (l<j) do dec(j);
                if (i<=j) then
                begin
                        p:=b[i];
                        b[i]:=b[j];
                        b[j]:=p;
                        inc(i);
                        dec(j);
                end;
        end;
        if (i<r) then lsb(i,r);
        if (l<j) then lsb(l,j);
end;
begin
        readln(n1);
        n2:=n1*2;
        for i:=1 to n1 do
        begin
                readln(a[i]);
                p[a[i]]:=true;
        end;
        for i:=1 to n2 do
        begin
                if not p[i] then
                begin
                        inc(k);
                        b[k]:=i;
                end;
        end;
        sb(1,n1);
        lsb(1,n1);
        i:=1;
        j:=1;
        while (i<=n1) and (j<=n1) do
        begin
                if (a[i]<b[j]) then
                begin
                        inc(i);
                        inc(j);
                        inc(ans);
                end
                else inc(i);
        end;
        write(ans);
end.
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值