首页 > 其他 > 详细

CCF-损坏的RAID5-201903-3

时间:2019-06-08 20:12:09      阅读:728      评论:0      收藏:0      [点我收藏+]

 这道题考试的时候,并没有怎么读懂题意,只拿到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 }

 

CCF-损坏的RAID5-201903-3

原文:https://www.cnblogs.com/xidian-mao/p/10991393.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!