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 @   浪矢-CL  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示