【UER #8】打雪仗
阿新 • • 發佈:2018-12-23
一道 如果 for getc 否則 rac 就是 getchar 意思
題目:http://uoj.ac/contest/47/problem/454
第一次做通信題,看了半天才搞懂是什麽意思。
考慮把字符串拆成三段,每段長度為$\frac{2}{3}n$
對於B:
統計每段中有多少個需要知道的下標,然後讓A全文發送下標最多的一段,這裏只要發送兩個字符告知A應該發送哪一段即可
然後遍歷剩下的兩段,如果當前下標是需要知道的,就發送1,否則就發送0,這裏需要發送$\frac{4}{3}n$個字符
所以對於B,最多只要發送$\frac{4}{3}n + 2$個字符
對於A:
先讀入兩個字符,然後全文發送B需要的那一段
同樣遍歷剩下的兩段,如果讀到的B發送過來的信息是1,則發送當前文字,如果是0則不輸出任何字符
首先最多的那一段,它至少包含了$\frac{1}{2}n$個下標,所以在剩下的兩段中,我們最多只需發送$\frac{1}{2}n$次即可
總的發送次數就是$\frac{1}{2}n + \frac{2}{3}n$
題目並不難,但這是一道通信題,要註意一些操作細節,具體見代碼:
A:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n, m; 5 char s[2010]; 6 string cur; 7 8 inline char Putchar(char c) 9 { 10 putchar(c);11 fflush(stdout); 12 } 13 14 void init() 15 { 16 ifstream fin("alice.in"); 17 fin >> n >> m >> (s + 1); 18 } 19 20 int main() 21 { 22 ifstream fin("alice.in"); 23 fin >> n >> m >> (s + 1); 24 cur.push_back(getchar()), cur.push_back(getchar());25 if(cur == "00") 26 { 27 for(int i = 1; i <= 666; ++i) Putchar(s[i]); 28 for(int i = 667; i <= 2000; ++i) 29 { 30 if(getchar() == ‘1‘) Putchar(s[i]); 31 else fflush(stdout); 32 } 33 } 34 else if(cur == "01") 35 { 36 for(int i = 1; i <= 666; ++i) 37 { 38 if(getchar() == ‘1‘) Putchar(s[i]); 39 else fflush(stdout); 40 } 41 for(int i = 667; i <= 1332; ++i) Putchar(s[i]); 42 for(int i = 1333; i <= 2000; ++i) 43 { 44 if(getchar() == ‘1‘) Putchar(s[i]); 45 else fflush(stdout); 46 } 47 } 48 else 49 { 50 for(int i = 1; i <= 1332; ++i) 51 { 52 if(getchar() == ‘1‘) Putchar(s[i]); 53 else fflush(stdout); 54 } 55 for(int i = 1333; i <= 2000; ++i) Putchar(s[i]); 56 } 57 return 0; 58 }
B:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 string ans; 5 int n, m; 6 int pos[1010], cnt[2010]; 7 8 inline char Putchar(char c) 9 { 10 putchar(c); 11 fflush(stdout); 12 } 13 14 int main() 15 { 16 ifstream fin("bob.in"); 17 fin >> n >> m; 18 for(int i = 1; i <= n; ++i) 19 { 20 fin >> pos[i]; 21 cnt[pos[i]] = 1; 22 } 23 for(int i = 1; i <= 2000; ++i) cnt[i] += cnt[i - 1]; 24 int c1 = cnt[666], c2 = cnt[1332] - cnt[666], c3 = n - cnt[1332]; 25 int mx = max(c1, max(c2, c3)); 26 memset(cnt, 0, sizeof(cnt)); 27 for(int i = 1; i <= n; ++i) cnt[pos[i]] = 1; 28 if(c1 == mx) 29 { 30 Putchar(‘0‘), Putchar(‘0‘); 31 for(int i = 1; i <= 666; ++i) 32 { 33 if(cnt[i]) ans.push_back(getchar()); 34 else getchar(); 35 } 36 for(int i = 667; i <= 2000; ++i) 37 { 38 Putchar(‘0‘ + cnt[i]); 39 if(cnt[i]) ans.push_back(getchar()); 40 } 41 } 42 else if(c2 == mx) 43 { 44 Putchar(‘0‘), Putchar(‘1‘); 45 for(int i = 1; i <= 666; ++i) 46 { 47 Putchar(‘0‘ + cnt[i]); 48 if(cnt[i]) ans.push_back(getchar()); 49 } 50 for(int i = 667; i <= 1332; ++i) 51 { 52 if(cnt[i]) ans.push_back(getchar()); 53 else getchar(); 54 } 55 for(int i = 1333; i <= 2000; ++i) 56 { 57 Putchar(‘0‘ + cnt[i]); 58 if(cnt[i]) ans.push_back(getchar()); 59 } 60 } 61 else 62 { 63 Putchar(‘1‘), Putchar(‘0‘); 64 for(int i = 1; i <= 1332; ++i) 65 { 66 Putchar(‘0‘ + cnt[i]); 67 if(cnt[i]) ans.push_back(getchar()); 68 } 69 for(int i = 1333; i <= 2000; ++i) 70 { 71 if(cnt[i]) ans.push_back(getchar()); 72 else getchar(); 73 } 74 } 75 ofstream fout("bob.out"); 76 fout << ans << endl; 77 return 0; 78 }
【UER #8】打雪仗