纸牌游戏

来源:互联网 发布:问卷网数据导出wps 编辑:程序博客网 时间:2024/04/27 17:55

前言
“发明负数干嘛?用来表示你的颜值与智商。”欢迎来到嘟嘟课堂。今天,我们来讲一讲暴力题——纸牌游戏。
题目描述
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.
原创粉丝点击