校内训练20161025

T1 Jingle

一道比较水的模拟题,直接放代码了,连STD都没写,果然是太强了。

#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
void FileInOut(){
     freopen("jingle.in" , "r" , stdin);
     freopen("jingle.out" , "w" , stdout);
}
const int maxn = 1000 + 5;
char s[maxn];
int main(){
    FileInOut();
    scanf("%s" , s);
    int res = 0 , ans = 0 , l = strlen( s );
    rep( i , 0 , l - 1 ){
        switch( s[i] ){
            case '/' : if( res == 64 ) ++ans; res = 0; break;
            case 'W' : res += 64; break;
            case 'H' : res += 32; break;
            case 'Q' : res += 16; break;
            case 'E' : res += 8;  break;
            case 'S' : res += 4;  break;
            case 'T' : res += 2;  break;
            case 'X' : res += 1;  break;
        }
    }
    cout << ans << endl;
    return 0;
}

T2 perfect

首先发现,如果建图后发现图中存在奇环的话,显然是不能的。那么,只需要将这张图进行二分染色便可以过了,不知道为什么要SPJ,基本上都是这么写的吧,还有人RE了。

#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
void FileInOut(){
     freopen("perfect.in" , "r" , stdin);
     freopen("perfect.out" , "w" , stdout);
}
inline int _read(){
    int x = 0 , f = 1;
    char ch = getchar();
    while( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar(); }
    while( isdigit(ch) ){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
const int maxn = 10000 + 5 , maxe = 200000 + 100;
struct edge{
    int v , nxt;
} e[maxe];
int head[maxn] , _t ;
inline void ins( int u , int v ){
    e[++_t].v = v , e[_t].nxt = head[u] , head[u] = _t;
    e[++_t].v = u , e[_t].nxt = head[v] , head[v] = _t;
}
bool flg = 1;
int x[maxn];
void dfs( int u , int f ){
    for( int i = head[u] ; ~i ; i = e[i].nxt ){
        int v = e[i].v;
        if( v == f ) continue;
        if( x[v] == -1 ) x[v] = 1 - x[u] , dfs( v , u );
        if( x[u] + x[v] != 1 ) { puts("NO"); exit(0); }     
    }
}
int main(){
    FileInOut();
    memset( head , 0xff , sizeof head );
    memset( x , 0xff , sizeof x );
    int N = _read() , M = _read() , u , v ;
    rep( i , 1 , M ){
        u = _read() , v = _read();
        ins( u , v );
    }
    rep( i , 1 , N )
        if( -1 == x[i] ) x[i] = 0 , dfs( i , -1 );
    puts("YES");
    rep( i , 1 , N - 1 ) printf("%d " , x[i]);
    printf("%d\n" , x[N]);
    return 0;
}

T3 pair

这好像是我所有写过的T3中最无聊的一道,不高兴写BF,自己随便码了一个比较水的贪心,结果果然WA了。
贪心

#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
void FileInOut(){
     freopen("pair.in" , "r" , stdin);
     freopen("pair.out" , "w" , stdout);
}
const int maxn = 10 + 5 , INF = 0x3f3f3f3f;
char s[maxn];
int a[maxn][maxn] , del[maxn][maxn] , N , M;
#define MP make_pair
#define PII pair<int , int>
queue<PII> q;
const int dx[] = { 0 , 1 , 0 , -1 };
const int dy[] = { 1 , 0 , -1 , 0 };
int dis[maxn][maxn] , sdist = 0 , ans = 0;
bool vis[maxn][maxn];
void bfs( PII S ){
    while( !q.empty() ) q.pop();
    memset( dis , 0x3f , sizeof dis );
    memset( vis , 0 , sizeof vis );
    int target = a[S.first][S.second];
    dis[S.first][S.second] = 0 , vis[S.first][S.second] = 1;
    q.push( S );
    while( !q.empty() ){
        PII u = q.front(); q.pop();
        rep( k , 0 , 3 ){
            int x = u.first + dx[k] , y = u.second + dy[k];
            if( x <= 0 || x > N || y <= 0 || y > M ) continue;
            if( vis[x][y] == 1 || a[x][y] == -1 ) continue;
            dis[x][y] = dis[u.first][u.second] + 1;
            if( a[x][y] == target ){
                a[x][y] = a[S.first][S.second] = 10;
                sdist += dis[x][y] - 1 , ans++;
                return;
            }
            if( a[x][y] == 10 ) q.push( MP(x , y) ) , vis[x][y] = 1;
        }
    }   
}
int main(){
    FileInOut();
    memset( a , 0xff , sizeof a );
    scanf("%d %d" , &N , &M);
    rep( i , 1 , N ){
        scanf("%s" , s);
        rep( j , 1 , M )
            if( isdigit(s[j - 1]) ) a[i][j] = s[j - 1] - '0';
            else a[i][j] = -1;
    }
    rep( t , 1 , N * M ){
        rep( i , 1 , N ) rep( j , 1 , M )
            if( a[i][j] != -1 && a[i][j] != 10 ){
                bfs( MP(i , j) );
            }
        }
    cout << ans << " " << sdist << endl;
    return 0;
}

这样只拿了80分,还可以了,STD 6k , 满满的害怕>-<

const maxsize=6;
type
    pointer=^node;
    node=record
               data:longint;
               next:pointer
         end;
var i,j,j1,j2,k,m,n,temp:longint;
    h,t,animals,maxmove,minlen:byte;
    ch:char;
    current,board:string;
    row,col,q,d:array [1..maxsize*maxsize] of byte;
    link,pair,mind:array [1..maxsize*maxsize,1..maxsize*maxsize] of shortint;
    len:array [0..33554431] of byte;
    p,flag,head,tail:pointer;
begin
     assign(input,'pair.in');
     reset(input);
     readln(m,n);
     board:='';
     for i:=1 to m do
     begin
          for j:=1 to n do
          begin
               read(ch);
               if ch<>'X' then
                  begin
                       board:=board+ch;
                       row[length(board)]:=i;
                       col[length(board)]:=j
                  end
          end;
          readln
     end;
     close(input);
     animals:=length(board);
     for i:=1 to animals do
     begin
          k:=0;
          for j:=1 to animals do
          begin
               if i=j then continue;
               if abs(row[i]-row[j])+abs(col[i]-col[j])=1 then
                  begin inc(k); link[i,k]:=j end
          end;
          inc(k);
          link[i,k]:=-1
     end;
     len[0]:=0;
     for i:=1 to 1 shl animals-1 do len[i]:=255;
     maxmove:=0; minlen:=0;
     new(head);
     head^.data:=0;
     head^.next:=nil;
     tail:=head;
     flag:=head;
     while head<>nil do
     begin
          temp:=head^.data;
          current:=board;
          if odd(temp) then current[animals]:=' ';
          for i:=animals-1 downto 1 do
          begin
               temp:=temp shr 1;
               if odd(temp) then current[i]:=' '
          end;
          for i:=1 to animals do
              if current[i]<>' ' then
                 begin
                      k:=0;
                      t:=0;
                      j:=1;
                      while link[i,j]<>-1 do
                      begin
                           j1:=link[i,j];
                           if current[j1]=' '
                              then begin inc(t);q[t]:=j1;d[t]:=1 end
                              else if (j1>i) and (current[i]=current[j1]) then
                                      begin inc(k); pair[i,k]:=j1;mind[i,k]:=0 end;
                           inc(j)
                      end;
                      h:=1;
                      while h<=t do
                      begin
                           j:=1;
                           while link[q[h],j]<>-1 do
                           begin
                                j1:=link[q[h],j];
                                if current[j1]=' '
                                   then begin
                                              for j2:=1 to t do
                                                  if j1=q[j2] then break;
                                              if j1<>q[j2] then
                                                 begin inc(t);q[t]:=j1;d[t]:=d[h]+1 end
                                        end
                                   else if (j1>i) and (current[i]=current[j1]) then
                                           begin
                                                for j2:=1 to k do
                                                    if j1=pair[i,j2] then break;
                                                if (j2>k) or (j1<>pair[i,j2]) then
                                                   begin inc(k); pair[i,k]:=j1;mind[i,k]:=d[h] end
                                           end;
                                inc(j)
                           end;
                           inc(h)
                      end;
                      for j:=1 to k do
                      begin
                           temp:=head^.data+1 shl (animals-i)+1 shl (animals-pair[i,j]);
                           if len[head^.data]+mind[i,j]<len[temp] then
                              begin
                                   if len[temp]=255 then
                                      begin
                                           new(p);
                                           p^.data:=temp;
                                           p^.next:=nil;
                                           tail^.next:=p;
                                           tail:=p
                                      end;
                                   len[temp]:=len[head^.data]+mind[i,j]
                              end
                      end
                 end;
          if head=flag then
             begin
                  flag:=tail;
                  if head<>tail then
                     begin
                          inc(maxmove);
                          minlen:=255;
                          p:=head^.next;
                          while p<>nil do
                          begin
                               if len[p^.data]<minlen then minlen:=len[p^.data];
                               p:=p^.next
                          end
                     end
             end;
          p:=head;
          head:=head^.next;
          dispose(p)
     end;
     assign(output,'pair.out');
     rewrite(output);
     writeln(maxmove,' ',minlen);
     close(output)
end.

还好今天没爆,据说是Day1难度,某些学佛都不屑做了,2333。
%yjh , %111116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值