通信题杂记

First Post:

Last Update:

Word Count:
752

Read Time:
4 min

Page View: loading...

很早就知道 UOJ454 了。

今天终于决定写。

然后发现通信题的运行调试很麻烦,在各种尝试后终于找到了可以正常运行的方法,而且不需要外部辅助。

把读入写成这样:

1
2
3
4
5
char read(){
char re=getchar();
for(;re==-1;re=getchar());
return(re);
}

这样读完就会自动等待对面输出。

然后文操这么写:

1
2
3
4
5
6
7
//Alice
system("del B.out"); //清空文件
freopen("A.out","w",stdout); //创建标准输出文件
while(access("B.out",0)==-1);
//等待对方创建标准输出文件,否则在无文件的情况下会直接卡死
freopen("B.out","r",stdin);
//重定向标准输入,这一行的位置必须位于确认文件存在之后
1
2
3
4
5
6
//Bob
system("del A.out");
//同上。因为两个程序会先后开,所以先开的那个会把文件占用,后开的删不掉
freopen("B.out","w",stdout);
while(access("A.out",0)==-1);
freopen("A.out","r",stdin);

需要使用 #include<unistd.h> 头文件。

然后就可以正常运行了。

附UOJ454 AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//Alice
#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<fstream>
#include<string>
using namespace std;
ifstream fin;
char read(){
char re=getchar();
for(;re==-1;re=getchar());
return(re-48);
}
void write(int ch){
putchar(ch+48);
fflush(stdout);
}
int n,m,k=0,te;
bool s[2010],need[2010];
char c;
int main(){
// #define DEBUG
#ifdef DEBUG
system("del B.out");
freopen("A.out","w",stdout);
while(access("B.out",0)==-1);
freopen("B.out","r",stdin);
#endif

fin.open("alice.in");
fin>>n>>m;
te=(n<<1)/3;
for(int i=1;i<=n<<1;++i){
fin>>c;
s[i]=c-48;
}
k=read()<<1;k+=read();
for(int i=1;i<=te;i++){
write(s[i+k*te]);
}
for(int i=1;i<=te;i++){
if(read()){
write(s[i+(k?0:te)]);
}
}
for(int i=1;i<=te;i++){
if(read()){
write(s[i+(k<2?te<<1:te)]);
}
}
for(int i=te*3+1;i<=n<<1;i++){
write(s[i]);
}
return(0);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//Bob
#include<iostream>
#include<unistd.h>
#include<fstream>
#include<string>
using namespace std;
ifstream fin;
char read(){
char re=getchar();
for(;re==EOF;re=getchar());
return(re-48);
}
void write(int ch){
putchar(ch+48);
fflush(stdout);
}
ofstream fout;
int n,m,te,a[2010],s[3],k;
bool p[2010],ans[2010];
int main(){
// #define DEBUG
#ifdef DEBUG
system("del A.out");
freopen("B.out","w",stdout);
while(access("A.out",0)==-1);
freopen("A.out","r",stdin);
#endif

fin.open("bob.in");
fout.open("bob.out");
fin>>n>>m;
te=(n<<1)/3;
for(int i=1;i<=n;++i){
fin>>a[i];
p[a[i]]=1;
}
for(int i=1;i<=te;i++){
s[0]+=p[i];s[1]+=p[i+te];s[2]+=p[i+(te<<1)];
}
k=s[0]>s[1]?0:1;
k=s[k]>s[2]?k:2;
write(k>>1);write(k&1);
for(int i=1;i<=te;i++){
ans[i+k*te]=read();
}
for(int i=1;i<=te;i++){
write(p[i+(k?0:te)]);
if(p[i+(k?0:te)]){
ans[i+(k?0:te)]=read();
}
}
for(int i=1;i<=te;i++){
write(p[i+(k<2?te<<1:te)]);
if(p[i+(k<2?te<<1:te)]){
ans[i+(k<2?te<<1:te)]=read();
}
}
for(int i=te*3+1;i<=n<<1;i++){
ans[i]=read();
}
for(int i=1;i<=n;i++){
fout<<ans[a[i]];
}
return(0);
}