Day6上 括号匹配专项

滑稽的题

T1

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;
int n;
int a,b,x;
int main()
{
//    freopen("book.in","r",stdin);
//    freopen("bok.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==5)
        {
            a++;
            continue;
        }
        if(x==10)
        {
            if(a)
            {
                a--;
                b++;
                continue;
            }else
            {
                printf("No\n");
                return 0;
            }
        }
        if(x==20)
        {
            if(a&&b)
            {
                a--;
                b--;
                continue;
            }
            if(a>=3&&(!b))
            {
                a-=3;
                continue;
            }
            printf("No\n");
            return 0;
        }
    }    
    printf("YES\n");
    return 0;
}
50

奇怪我手动测得都对,而且超时也不太可能吧。? 待解决。

模拟白

 

T2

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;
const int N=1e6+100;
int n,m;
int sum[N],a[N];
bool is[N];
int main()//又来模拟? 
{
    freopen("program.in","r",stdin);
    freopen("program.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int i=1,x;i<=m;i++)
    {
        scanf("%d",&x);
        is[x]=1;
    }
    for(int i=1;i<=n;i++)
    {
        if(is[i])    sum[a[i]]--;
        else
            sum[a[i]]++;
        if(sum[a[i]]<0)
        {
            printf("NO\n");
            return 0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(sum[i]<0||(sum[i]%2))
        {
            printf("NO\n");
            return 0;
        }
        sum[i]/=2;
    }
    for(int i=n;i>=1;i--)
    if(!is[i])//要不是掉下这一步我就可能A了。
    {
        if(sum[a[i]])
        {
            is[i]=1;
            sum[a[i]]--;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(is[i])
            printf("-%d ",a[i]);
        else 
            printf("+%d ",a[i]);
    }    
    return 0;
}

 括号翻转,站。

区间dp。

但我觉得,模拟就ok。

 

T3

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;
const int N=14;
int h[N],nex[N*2],to[N*2],w[N*2],cnt;
int n,m,q;
int x,y,z;
void add()
{
    scanf("%d%d%d",&x,&y,&z);
    to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt,w[cnt]=z;
    to[++cnt]=x,nex[cnt]=h[y],h[y]=cnt,w[cnt]=z;
}
int kid[N][2];
bool vis[N];
int A,B,flag;
void dfs(int x)
{
    if(x==B)
    {        
        bool is=1;
        for(int i=1;i<=10;i++)
        {
            if(kid[i][0]&&(!kid[i][1]))
                is=0;
            if(kid[i][1]&&(!kid[i][0]))
                is=0;
            if(abs(kid[i][0]-kid[i][1])%2)
                is=0;
        }
        if(is)    flag=1;
        return ;
    }
    for(int i=h[x],v;i;i=nex[i])
    if(!vis[to[i]])
    {
        vis[to[i]]=1;
        if(w[i]>0)
            kid[w[i]][1]++;
        else kid[-w[i]][0]++;
        dfs(to[i]);
        vis[to[i]]=0;
        if(w[i]>0)
            kid[w[i]][1]--;
        else kid[-w[i]][0]--;
    }
}
int main()
{
    freopen("maze.in","r",stdin);
    freopen("maze.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        add();
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d",&A,&B);
        flag=0;
        vis[A]=1;
        dfs(A);
        if(flag)    printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
first 25

预处理Floyed  dp

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int n,m;
int g[105][105][40],q[105*105*40][3],t,x,y,z;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        if(!z)
        {
            if(z<0)    z=-z;
            else z+=10;
            g[x][y][z]=g[y][x][z]=1;
        }else
        {
            g[x][y][z]=g[y][x][z]=1;
            t++;q[t][0]=x,q[t][1]=y,q[t][2]=0;
            t++;q[t][0]=y,q[t][1]=x,q[t][0]=0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        t++;
        q[t][0]=i;
        q[t][1]=i;
        q[t][2]=0;
    }
    for(int s=1;s<=t;s++)
    {
        int x=q[s][0];
        int y=q[s][1];
        int kid=q[s][2];
        if(!kid)
            for(int i=1;i<=n;i++)
            if(g[i][x][kid-10]==1&&g[i][y]==0)
            {
                g[i][y][0]=1;
                t++;
                q[t][0]=i;
                q[t][1]=y;
                q[t][2]=0;
            }
        else
        for(int i=1;i<=10;i++)
        {
            if(g[i][x]&&(!g[i][y]))
            {
                g[i][y]=1;
                t++;
                q[t][0]=i;
                q[t][1]=y;
                q[t][2]=0;
            }
            if(g[y][i]&&(!g[x][i]))
            {
                g[x][i]=1;
                t++;
                q[t][0]=x;
                q[t][1]=i;
                q[t][2]=0;
            }
            for(int j=1;j<=10;j++)
            if(g[y][i][j]&&(!g[x][i][j+20]))
            {
                g[x][i][j+20]=1;
                t++;
                q[t][0]=x;
                q[t][1]=i;
                q[t][2]=j+20;
            }
        }            
    }
    int q;
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d%d",&x,&y);
        if(g[x][y][0])
            printf("YES\n");
        else printf("NO\n");
    
    }
    return 0;
}
dp

 

posted @ 2017-11-02 10:52  浪矢-CL  阅读(196)  评论(0编辑  收藏  举报