这道题考试的时候,并没有怎么读懂题意,只拿到10分....然后CCF分区竞赛又考了一个这样的题
后来仔细读题(其实是看图懂得,我觉得题意有些地方还是没有说清),搞清题意其实并不难,就是一个找规律,代码量不大
核??: 阵列由n+1个磁盘组成,每个磁盘由块(8位字符串)组成,s个块组成一个条带.
我们把每一个磁盘的编号disk看出纵坐标, 条带k看出横坐标.(所有磁盘的第一个条带k值相同),本题实质就是根据块号x查找(k,disk)的过程
首先我们求出块x所在的条带号y: y=x/s
然后同一排有n个条带, 那么可以得出: k=y/n
冗余条带的位置从第一排开始为从右往左,同一排的数据编号紧跟冗余带从左往右
那么第k排冗余带的位置 rd=n-k%(n+1), 那么第y条数据带的disk=(rd+y%n+1)%(n+1)
最后我们将块号x细化到第disk个磁盘的第start块:
start=x%s+k*s, 数据开始的位置_start=start*8
还有就是有一点我不明白,CCF编译器怎么回事,
cin >> id; cin >> dt[id]; 满分
cin>>id>>dt[id]; 10分
找这个bug浪费我一晚上时间.... 希望有人会告诉我呀 (mhllwmt@foxmail.com)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e3 + 7; 5 const string base = "0123456789ABCDEF"; 6 string dt[N]; 7 int n, s, l, max_k; 8 int to_int (char ch) { 9 if (ch >= ‘0‘ && ch <= ‘9‘) return ch - ‘0‘; 10 else return ch - ‘A‘ + 10; 11 } 12 void _xor (string& ans, string str) { 13 for (int i = 0; i < str.size(); i++) { 14 int x = to_int(ans[i]); 15 int y = to_int(str[i]); 16 ans[i] = base[(x ^ y)]; 17 } 18 } 19 string get_xor (int disk, int _start) { 20 string ans(8,‘0‘); 21 for (int i = 0; i <= n; i++) 22 if (i != disk) 23 _xor(ans, dt[i].substr(_start, 8)); 24 return ans; 25 } 26 int main () 27 { 28 ios::sync_with_stdio(false); 29 cin >> n >> s >> l; 30 n -= 1; // (n块数据,1块冗余) 31 for (int i = 1; i <= l; i++) { 32 int id; 33 cin >> id; 34 cin >> dt[id]; 35 // cin>>id>>dt[id]; 这样不知道为啥错误 36 max_k = dt[id].size() / 8 / s; 37 } 38 int m; cin >> m; 39 while (m--) { 40 int x; cin >> x; 41 int y = x / s; 42 int k = y / n; 43 int disk = (n - k % (n + 1) + y % n + 1) % (n + 1); 44 if (k >= max_k) cout << "-\n"; 45 else if (dt[disk].size() != 0) { 46 int _start = 8 * (k * s + x % s); 47 cout << dt[disk].substr(_start, 8) << "\n"; 48 } 49 else if (dt[disk].size() == 0 && l == n) { 50 int _start = 8 * (k * s + x % s); 51 cout << get_xor(disk, _start) << "\n"; 52 } 53 else cout << "-\n"; 54 } 55 return 0; 56 }
原文:https://www.cnblogs.com/xidian-mao/p/10991393.html