zoukankan      html  css  js  c++  java
  • CF-920C-Swap Adjacent Elements 贪心

    题意

    给你一个1~n的排列。

    并给你一个字符串——其中用0和1表示对应数列中的位置上的值可不可以和后面相邻的数交换。

    判断该数列能否在限制中交换为不降序数列。

    思路

    由于刚学了树状数组,一开始以为是用这样的数据结构去找有没有逆序。

    事实上题目中的1~n并且每个数并不相同应该引起注意。关键就是这了。

    下面是两种不同的思路;

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <algorithm>
    //这个思路是只要当前的最大比位子i大,说明要向后移动,要是str=0,则NO;
    using namespace std;
    int n,a[200000+10];
    string str;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        cin>>str;
        int maxn=0,flag=1;
        for(int i=1;i<=n;i++)
        {
            if(maxn < a[i])maxn = a[i];
            if(str[i-1]=='0')
            {
                if(maxn>i)
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag)puts("YES");
        else puts("NO");
        return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <string>
    //队长是先跑字符串,判断每个i位子的最大可能值;
    using namespace std;
    int a[200000],dp[200000],n;
    string str;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        cin>>str;
        dp[n-1]=n;
        for(int i=n-2;i>=0;i--)
        {
            if(str[i]=='1')
            {
                dp[i]=dp[i+1];
            }
            else dp[i]=i+1;
        }
        int flag=1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>dp[i-1])
            {
                flag=0;
                break;
            }
        }
        if(flag)puts("YES");
        else puts("NO");
    
    
        return 0;
    }
    skr
  • 相关阅读:
    关于各种好玩的神奇函数
    模板——AC自动机
    模板——造数据
    VIM常用操作
    springboot注解
    面试题
    Linux常用命令
    Zookeeper
    对cpu与load的理解及线上问题处理思路
    top
  • 原文地址:https://www.cnblogs.com/ckxkexing/p/8409778.html
Copyright © 2011-2022 走看看