15.卡牌游戏

Description

小张在玩一种卡牌游戏,牌组由2n张牌组成,其中n张上写有数字1..n各一张,其余n张上全部是数字0.

现在牌组经过随机打乱后,小张拿走其中n张牌作为手牌,其余n张牌作为牌堆。

小张想经过若干次如下操作使得牌堆自顶向下的牌依次为1..n.

每一次操作,小张选择任意一张手牌放到牌堆底,并将牌堆顶的牌放入手牌。

他想知道最少进行几次操作,使得牌堆自顶向下的牌依次为1..n.

Input

第一行一个数

n(1 \leq n \leq 200000 )

第二行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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值