C. Nauuo and Cards

https://codeforc.es/contest/1173/problem/C

题意:在一次操作中,她可以选择手中的一张牌,然后玩它——把它放在这堆牌的底部,然后从这堆牌中抽出上面的牌。问最后牌低顺序1-n的最少操作;

思路:1、牌低有一部分有序1-k;判断前面的是否在操作时能按顺序结束牌尾;2、牌低无序,那么就要先补着,开始按顺序放的时候时能得到的牌与它该放的位置的偏移,在这些偏移前放的是无序的,所以这些操作加上最后1-n的操作;

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define sfi(i) scanf("%d",&i)
#define sfs(i) scanf("%s",(i))
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-16
#define PI acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))'9')
    {
        if(ss=='-')f=-1;ss=getchar();
    }
    while(ss>='0'&&ss<='9')
    {
        x=x*10+ss-'0';ss=getchar();
    }    return f*x;
}

int a[maxn],b[maxn],pos[maxn];
int main()
{
    //FAST_IO;
    //freopen("input.txt","r",stdin);

    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        pos[b[i]]=i;
    }
    if(pos[1])
    {
        int id=0;
        int cnt=1;
        for(int i=pos[1];i<=n;i++)
        {
            if(b[i]==cnt)
            {
                cnt++;
                id=i;
            }
            else break;
        }
        //cout<n)
            {
                cout<

 

你可能感兴趣的:(思维)