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

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





