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;
    }
  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/ljc20020730/p/9865404.html
Copyright © 2011-2022 走看看