CCF-損壞的RAID5-201903-3


 這道題考試的時候,並沒有怎么讀懂題意,只拿到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

    

                                         紅色標記表示為k值

還有就是有一點我不明白,CCF編譯器怎么回事,

                       cin >> id; cin >> dt[id];  滿分

               cin>>id>>dt[id]; 10分

找這個bug浪費我一晚上時間....  

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e3 + 7; 
 4 const string base = "0123456789ABCDEF";
 5 string dt[N];
 6 int n, s, l, max_k;
 7 int to_int (char ch) {
 8     if (ch >= '0' && ch <= '9') return ch - '0';
 9     else  return ch - 'A' + 10;
10 }
11 void _xor (string& ans, string str) {
12     for (int i = 0; i < str.size(); i++) {
13         int x = to_int(ans[i]);
14         int y = to_int(str[i]);
15         ans[i] = base[(x ^ y)];
16     }
17 }
18 string get_xor (int disk, int _start) {
19     string ans(8,'0');
20     for (int i = 0; i <= n; i++)
21         if (i != disk)
22             _xor(ans, dt[i].substr(_start, 8));
23     return ans;
24 }
25 int main ()
26 {
27     ios::sync_with_stdio(false);
28     cin >> n >> s >> l;
29     n -= 1; // (n塊數據,1塊冗余)
30     for (int i = 1; i <= l; i++) {
31         int id; 
32         cin >> id;
33         cin >> dt[id];
34         // cin>>id>>dt[id]; 這樣不知道為啥錯誤
35         max_k = dt[id].size() / 8 / s;
36     }
37 int m; cin >> m; 38 while (m--) { 39 int x; cin >> x; 40 int y = x / s; 41 int k = y / n; 42 int disk = (n - k % (n + 1) + y % n + 1) % (n + 1); 43 if (k >= max_k) cout << "-\n"; 44 else if (dt[disk].size() != 0) { 45 int _start = 8 * (k * s + x % s); 46 cout << dt[disk].substr(_start, 8) << "\n"; 47 } 48 else if (dt[disk].size() == 0 && l == n) { 49 int _start = 8 * (k * s + x % s); 50 cout << get_xor(disk, _start) << "\n"; 51 } 52 else cout << "-\n"; 53 } 54 return 0; 55 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM