zoukankan      html  css  js  c++  java
  • HGOI 20181028 题解

    HGOI 20181028(复赛备考)

    /*
    真是暴力的一天,最后一题MLE?由于数组开得太大了!!!
    270滚粗
    考场上好像智商高了很多?!(假的)
    */

    sol:暴力求解,然后没有数据范围吐槽一下(我开了10000000)

    code:(100pts)

    # include <bits/stdc++.h>
    using namespace std;
    const int MAXN=1e7+10;
    char s[MAXN];
    int fun(char c)
    {
        if (c=='W') return 64;if (c=='H') return 32;if (c=='Q') return 16;
        if (c=='E') return 8; if (c=='S') return 4; if (c=='T') return 2;
        if (c=='X') return 1;
    }
    bool check(int l,int r)
    {
        int ret=0;
        for (int i=l;i<=r;i++) ret+=fun(s[i]);
        if (ret==64) return true;
        else return false;
    }
    int main()
    {
        freopen("jingle.in","r",stdin);
        freopen("jingle.out","w",stdout);
        cin>>s; int len=strlen(s);
        int cnt=0; for (int i=0;i<len;i++) if (s[i]=='/') cnt++;
        cnt--;
        int l=1,r,now=1;
        int ans=0;
        while(true) {
            for (r=l+1;r<=len;r++) if (s[r]=='/') break; r--;
            if (check(l,r)) ans++;
            l=r+2;
            if (now==cnt) break;
            now++;
        }
        printf("%d
    ",ans);
        return 0;
    }

    其实看一下就可以发现奇环显然是不行的。偶环一定可以通过0和1求解,然后就想到二分图

    显然,如果这是张二分图那么就Yes采取01染色法求解(dfs暴力O(n)),如果不能做到01染色那么就输出No

    但是注意图并不一定是连通图所以要多遍dfs

    code(100pts)——第一次在考场上写read和write很激动然后封装了Input Output Base System的struct!码风很奇怪。。。

    # include <bits/stdc++.h>
    # define Rint register int
    using namespace std;
    const int MAXN=10005,MAXM=2*100005;
    int head[MAXN],col[MAXN],tot=0,n,m;
    bool vis[MAXN],ff;
    struct rec{ int pre,to;}a[MAXM];
    struct IOBS{
        inline int read()
        {
            int X=0,w=0; char c=0;
            while (!(c>='0'&&c<='9')) { w|=c=='-';c=getchar();}
            while (c>='0'&&c<='9') { X=(X<<3)+(X<<1)+(c^48); c=getchar();}
            return w?-X:X;
        }
        inline void write(Rint x)
        {
            if (x<0) { x=-x; putchar('-');}
            if (x>9) write(x/10);
            putchar(x%10+'0');
        }
        inline void write_files(Rint x,char cc){ write(x); putchar(cc);}
        inline void Files()    { freopen("perfect.in","r",stdin); freopen("perfect.out","w",stdout);}
    }IO;
    inline void adde(Rint u,Rint v)
    {
        a[++tot].pre=head[u];
        a[tot].to=v;
        head[u]=tot;
    }
    inline void dfs(Rint u,Rint c)
    {
        vis[u]=true; col[u]=c;
        for (Rint i=head[u];i;i=a[i].pre){
            int v=a[i].to; 
            if (vis[v]&&col[v]!=(!c)) { ff=false; return;}
            if (vis[v]&&col[v]==(!c)) continue;
            dfs(v,!c);
        }
    }
    int main()
    {
        IO.Files(); n=IO.read(); m=IO.read();
        int u,v; 
        for (Rint i=1;i<=m;i++) {
            u=IO.read();v=IO.read();
            adde(u,v); adde(v,u);
        }
        memset(vis,false,sizeof(vis));
        for (Rint i=1;i<=n;i++) {
            if (vis[i]) continue;
            ff=true; dfs(i,0);
            if (ff==false) { printf("NO
    "); return 0;}
        }
        putchar('Y');putchar('E');putchar('S');putchar('
    ');
        for (Rint i=1;i<=n;i++) 
        if (i!=n) IO.write_files(col[i],' ');
        else IO.write(col[i]);
        putchar('
    ');
        return 0;
    }

     

    sol: 通过n,m<=5发现是暴力题然后算了下裸bfs暴力会TLE但是还是打了23333!

    我可是码过斗地主、德州扑克的人!其实这点码量差不多就是100行左右吧

    不大不大 bfs套bfs! (注意Mle!)

    # include <bits/stdc++.h>
    # define Rint register int
    using namespace std;
    const int MAXN=7;
    const int dx[]={0,-1,0,1,0};
    const int dy[]={0,0,1,0,-1};
    struct node{ int M[MAXN][MAXN],L,scr;};
    struct rec{ int x,y,step;};
    char s[MAXN];
    int mp[MAXN][MAXN],start[MAXN][MAXN],n,m;
    bool inq[MAXN][MAXN];
    queue<rec>Q;  
    inline bool check(Rint X1,Rint Y1,Rint X2,Rint Y2,int &d)
    {
        while(!Q.empty()) Q.pop(); 
        memset(inq,false,sizeof(inq));
        inq[X1][Y1]=true; rec st; st.step=0; st.x=X1; st.y=Y1;
        Q.push(st);
        while (!Q.empty()) {
            rec u=Q.front();Q.pop(); 
            for (int i=1;i<=4;i++) {
                rec v;
                v.x=u.x+dx[i]; v.y=u.y+dy[i]; v.step=u.step+1;
                if (v.x==X2&&v.y==Y2) { d=v.step-1;  return true;}
                if (v.x>n||v.x<1|v.y>m||v.y<1||inq[v.x][v.y]||mp[v.x][v.y]!=10) continue;
                if (v.x==X2&&v.y==Y2) { d=v.step-1;  return true;}
                Q.push(v); inq[v.x][v.y]=true;
            }
        }
        return false;
    }
    queue<node>q;
    inline void bfs()
    {
        node st; memcpy(st.M,start,sizeof(start));
        st.L=0; st.scr=0;
        int ans_scr=0,ans_L=0x7f7f7f7f;
        q.push(st);
        while (!q.empty()) {
            node u=q.front();q.pop();
            for (Rint X1=1;X1<=n;X1++)
            for (Rint Y1=1;Y1<=m;Y1++) {
              if (u.M[X1][Y1]==-1||u.M[X1][Y1]==10) continue;
                 for (Rint X2=1;X2<=n;X2++)
                 for (Rint Y2=1;Y2<=m;Y2++) {
                      if (X1==X2&&Y1==Y2) continue;
                      if (u.M[X2][Y2]==-1||u.M[X2][Y2]==10) continue;
                      if (u.M[X1][Y1]!=u.M[X2][Y2]) continue;
                      int delt_L; memcpy(mp,u.M,sizeof(u.M));
                      if (check(X1,Y1,X2,Y2,delt_L)) {
                          node v=u; memcpy(v.M,u.M,sizeof(u.M));
                          v.L=u.L+delt_L; v.scr=u.scr+1;
                          v.M[X1][Y1]=v.M[X2][Y2]=10;
                          if (v.scr>ans_scr) { ans_scr=v.scr; ans_L=v.L; }
                          else if (v.scr==ans_scr&&v.L<ans_L) ans_L=v.L; 
                          q.push(v);
                      }
                  }
             }
        }
        if (ans_scr==0) printf("0 0
    "); 
        else printf("%d %d
    ",ans_scr,ans_L);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (Rint i=1;i<=n;i++) {
            cin>>s;
            for (Rint j=0;j<m;j++)
            if (s[j]>='0'&&s[j]<='9') start[i][j+1]=s[j]-'0';
            else if (s[j]=='X') start[i][j+1]=-1;
        }
        bfs();
        return 0;
    }
  • 相关阅读:
    定时任务时间表达式的规则(自己总结)
    本地vagrant配置虚拟域名的坑
    商派onex本地部署无法进入的问题
    一周一篇文章,立贴为证
    Ecshop安装的坑,建议不要使用!
    MYSQL查询语句优化
    .gitignore文件
    剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充
    Disruptor 为什么这么快?
    一篇文章让你成为 NIO 大师 - MyCAT通信模型
  • 原文地址:https://www.cnblogs.com/ljc20020730/p/9865404.html
Copyright © 2011-2022 走看看