Description
小张在玩一种卡牌游戏,牌组由2n张牌组成,其中n张上写有数字1..n各一张,其余n张上全部是数字0.
现在牌组经过随机打乱后,小张拿走其中n张牌作为手牌,其余n张牌作为牌堆。
小张想经过若干次如下操作使得牌堆自顶向下的牌依次为1..n.
每一次操作,小张选择任意一张手牌放到牌堆底,并将牌堆顶的牌放入手牌。
他想知道最少进行几次操作,使得牌堆自顶向下的牌依次为1..n.
Input
第一行一个数
第二行n个数,表示小张手中的牌。
第三行n个数,表示牌堆,数组从左向右的顺序表示牌堆自顶向下的顺序。
Output
一个整数,表示最少执行的操作数。
代码如下:
(这个也是借鉴学长的哈哈)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n, i, j, temp, ans = 0, max = 0;
bool flag = true, bol = true;
cin >> n;
vector<int> map(n + 1), stack(n + 1);
for (i = 0; i < n; i++)
{
cin >> temp;
map[temp] = 0;
}
for (i = 1; i <= n; i++)
{
cin >> temp;
stack[i] = temp;
map[temp] = i;
}
for (i = n - 1; temp != 1; i--)
{
if (stack[i] != --temp)
{
flag = false;
break;
}
}
if (flag)
{
for (j = stack[n] + 1; j <= n; j++)
{
if (map[j] <= j - (stack[n] + 1))
continue;
else
{
bol = false;
break;
}
}
if (bol)
ans += n - stack[n];
else
ans += 1 + n + n - stack[n];
}
else
{
for (i = 1; i <= n; i++)
{
temp = (map[i] - i + 1) > 0 ? (map[i] - i + 1) : 0;
max = std::max(max, temp);
}
ans += n;
ans += max;
}
cout << ans << endl;
return 0;
}