纯大模拟 提前打好板子 我只通过4个用例点 然后就超时了。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<bits/stdc++.h>
using namespace std;
int n, s, l;
unordered_map<int, string> ssd(103);
unordered_map<int, pair<int, int>> m;//(硬盘号,块号)
//编号到具体硬盘块的映射
//n:硬盘数目
//s:条带大小/块
//size:一个硬盘有多少个块
void change(int n,int s,int size) {//遍历int now = 0;int extra = n - 1;//冗余硬盘unordered_map<int, int> nums(n);//每个硬盘目前遍历到第几块硬盘//外循环:遍历条带for (int i = 0; i < (size / s); i++) {//内循环:遍历硬盘for (int j = (extra+1)%n; ; j=(j+1)%n) {if (j == extra) {nums[j]=nums[j]+s;break;}//遍历条带个数for (int k = 0; k < s; k++) {m[now++] = {j,nums[j]++};}}extra=(extra+n-1)%n;}
}
string get_string(int n,int k){return ssd[n].substr(k*8,8);
}
//一块4字节 8个字符
string work(int b) {if(b>=((ssd[0].size()/8 )/ s)*(n-1)*s)return "-";string s=get_string(m[b].first,m[b].second);return s;/*for(int i=0;i<((ssd[0].size()/8 )/ s)*(n-1)*s;i++){cout<<i<<" "<<m[i].first<<m[i].second<<endl;}return "";*/}
int main()
{//n:硬盘数目//s:条带大小//l:现存硬盘数目cin >> n >> s >> l;while (l--) {int index;//硬盘的顺序号string s;//8的倍数的字符串cin >> index >> s;ssd[index] = s;}change(n, s, ssd[0].size()/8);int m;//读取操作个数cin>>m;while (m--) {int b;//读取块号cin>>b;cout<<work(b)<<endl;}return 0;
}