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