zoukankan      html  css  js  c++  java
  • CF1381B Unmerge(01背包)

    挺有意思,主要是仔细观察这个数列和题目所给的信息,CF题目的解法经常就隐藏在题目信息和案例中

    首先我们肯定是关注题目所给的merge的定义,发现首位是一个与其他不同的特殊信息。其实不难发现,如果一个数能成为某个小数组的开头来合并的话

    在他后面的比他小的数,一定要跟他成为一个集合。否则不成立,因为如果当前作为B开头,那么之后不大于他的肯定不行,并且显然他作为a开头,后面的也不能作为b开头,因为这样无法得到正确答案

    因此我们按照这个思想划分,之后做一遍01背包观察是否能组成n就行

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<ll,ll> pll;
    const int N=2e6+10;
    const int inf=0x3f3f3f3f;
    const int mod=1e9+7;
    int p[N];
    int a[N];
    int st[N];
    int cnt[N];
    int f[N];
    int main(){
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            int i;
            for(i=1;i<=2*n;i++){
                st[i]=0;
                f[i]=0;
            }
            for(i=1;i<=2*n;i++){
                cin>>p[i];
            }
            int idx=0;
            int now=2*n;
            int num=2*n;
            int last=2*n;
            while(num){
                int i;
                int tmp=0;
                for(i=1;i<=last;i++){
                    if(p[i]==now){
                       tmp=i;
                    }
                }
                int res=0;
                for(i=tmp;i<=last;i++){
                    res++;
                    st[p[i]]=1;
                    num--;
                }
                last=tmp-1;
                cnt[++idx]=res;
                while(now&&st[now])
                    now--;
            }
            f[0]=1;
            for(i=1;i<=idx;i++){
                for(int j=n;j>=cnt[i];j--){
                    f[j]|=f[j-cnt[i]];
                }
            }
            if(f[n]){
                cout<<"YES"<<endl;
            }
            else{
                cout<<"NO"<<endl;
            }
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    《挑战程序设计竞赛》 读后感
    基于SOAP的xml网络交互心得
    不用客户端,轻松下视频
    在cmd窗口中查询android的sqlite3数据库表之步骤
    单链表的插入删除以及逆转
    java中排序一个字符串数组
    求质因数
    指针与引用的区别
    统计查询-sql
    ---随心买统计查询
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13579714.html
Copyright © 2011-2022 走看看