ccf 201903-3 损坏的RAID5
9月份考ccf,暑假打算做一些往年的真题。。。
这个题,一开始真是把我给看晕了
传说中的大模拟,果然不简单QAQ
首先读懂题目就是一个大难点,特别是对于我这种题目一长就看不进去的人来说
读懂题目之后,思路就好想了,下面简单说一下我的思路:
首先定义一个字符数组ss[N][M],然后用ss[i]存入编号为 i 的硬盘后面的字符串,
在后面处理的时候就可以用sscanf函数直接获取ss[i]中相应位置的十六进制数(输入用"%8x",输出用"%08X")。
再一个比较烧脑的地方就是根据输入的块的编号b确定该块所在的硬盘和条带编号
条带编号k=b/s/(n-1); 结合图从左到右读这个式子就能想明白
所在硬盘编号t=n-1+k*(n-1)+b/s%(n-1)+1; t%=n; 其中n-1是条带编号为0对应的校验盘位置,条带编号+1,校验盘-1(等价于+(n-1)); b/s%(n-1)是块所在硬盘相对校验盘的偏移量。(这是先前的版本,对的,但是很复杂。。。后来发现其实可以很简单,直接 t=b/s%n; 就出来了)
一开始我输入语句是这样写的:
for(int i=;i<l;i++){
int x;
scanf("%d",&x);
scanf("%s",ss[x]);
}
然后就是各种超时,哪怕我想方设法优化代码,怎么搞也只有70分
我就纳闷了,这时间复杂度我满打满算也不过1e7啊,咋就超时了呢?
百思不得其解,于是毅然百度。。。
然后发现很多几个题解都是用的很c++风格的代码,算法复杂度和我没什么区别,而且用的cin,居然还比scanf快???
于是乎,我发现了一条神奇的代码
1 ios::sync_with_stdio(false);
据说它可以关闭c++的流同步,防止cin超时
于是乎,我试着把所有的标准输入换成了cin,加上那句我看不懂的玩意儿,居然还真过了!!!
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int M=*+;
const int N=;
char ss[N][M];
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
int n,s,l;
cin>>n>>s>>l;//scanf("%d%d%d",&n,&s,&l);
for(int i=;i<l;i++){
int x;
cin>>x;//scanf("%d",&x);
cin>>ss[x];//scanf("%s",ss[x]);
}
int m;
cin>>m;//scanf("%d",&m);
while(m--){
ll b;
cin>>b;//scanf("%lld",&b);
ll t=n-+b/s/(n-)*(n-)+b/s%(n-)+,k=(b/s/(n-)*s+b%s)*;t%=n;
if(k>=M||ss[t][]==&&l<n-||ss[][k]==&&ss[][k]==&&ss[t][k]==){
printf("-\n");
continue;
}
if(ss[t][]==){
ll ans=;
for(int i=;i<n;i++){
if(i==t)continue;
ll x;
sscanf(ss[i]+k,"%8x",&x);
ans^=x;
}
printf("%08X\n",ans);
}
else{
ll ans;
sscanf(ss[t]+k,"%8x",&ans);
printf("%08X\n",ans);
}
}
return ;
}
但是scanf超时超在哪呢???
直到之后又看到一篇博客,我才知道字符串输入用scanf会超时,因为最后三组数据40kb的数据长度,意味着一个字符串最多有80kb个字符要输入,而一次最多有1000个字符串待输入,输入数据量贼大
于是改用专门的字符串输入函数gets或fgets就没问题了(不过据说gets大势已去,建议尽量用fgets)
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int M=*+;
const int N=;
char ss[N][M];
int main()
{
//freopen("in.txt","r",stdin);
int n,s,l;
scanf("%d%d%d",&n,&s,&l);
for(int i=;i<l;i++){
int x;
scanf("%d%*c",&x);
fgets(ss[x],M,stdin);//gets(ss[x]);
}
int m;
scanf("%d",&m);
while(m--){
ll b;
scanf("%lld",&b);
ll t=b/s%n,k=(b/s/(n-)*s+b%s)*;
if(k>=M||ss[t][]==&&l<n-||ss[][k]==&&ss[][k]==&&ss[t][k]==){
printf("-\n");
continue;
}
if(ss[t][]==){
ll ans=;
for(int i=;i<n;i++){
if(i==t)continue;
ll x;
sscanf(ss[i]+k,"%8x",&x);
ans^=x;
}
printf("%08X\n",ans);
}
else{
ll ans;
sscanf(ss[t]+k,"%8x",&ans);
printf("%08X\n",ans);
}
}
return ;
}
ccf 201903-3 损坏的RAID5的更多相关文章
- csp 201903-3 损坏的RAID5
问题描述 试题编号: 201903-3 试题名称: 损坏的RAID5 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 答题栏 核
- 损坏的RAID5
损坏的RAID5 string讀入卡cin 関同步 ios::sync_with_stdio(false) 由塊號映射到具體位置 塊號id對應第col個字符串 字符串開始的位置st #include& ...
- CCF-CSP题解 201903-3 损坏的RAID5
先吐槽先吐槽!因为输入太大,需要用fgets,读n个字符或读到回车终止. char *fgets(char *str, int n, FILE *stream) 因为scanf模拟考试T了10+次.因 ...
- 试题编号: 201903-3 试题名称: 损坏的RAID5
这题的数据未免也太水了,题目的意思好像默认是每块磁盘装载数据的长度是相等的.我写了判断每次取数据是否会超过每块磁盘存的数据的长度,然而并没有什么卵用.交上去20分,写了个数据测了下,如果要求的块太大的 ...
- 服务器较稳妥的磁盘阵列方案:RAID5+热备盘
最近公司这边要整个数据中心,但是我们这边磁盘阵列的方案选择方面需要做好万全的测试 内部测试的服务器当初损坏的磁盘1个做的raid5直接换个新磁盘做替换rebuild就行了 但是现在想的方法是5+1的方 ...
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...
- Linux -RAID
转自:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/25/3099464.html 硬盘类型 速度 SATA <150M/s S ...
- RAID磁盘阵列是什么(一看就懂)
在单机时代,采用单块磁盘进行数据存储和读写的方式,由于寻址和读写的时间消耗,导致I/O性能非常低,且存储容量还会受到限制.另外,单块磁盘极其容易出现物理故障,经常导致数据的丢失.因此大家就在想,有没有 ...
- 服务器RAID设置以及简单理解
备注: 适用于测试环境,生产环境暂时未验证 1. RAID种类 最高性能的RAID0 完全拆分所有的IO 不进行校验 但是单盘损坏, 数据完全丢失 最高损耗的RAID1 损失一半的存储容量, 做镜像, ...
随机推荐
- 分享常见的HTTP状态码
本内容摘抄自RUNOOB.COM 当浏览一个网页时,浏览器会向网页所在服务器发出请求.当浏览器确定接收并显示网页之前,此网页所在的服务器会返回一个含有HTTP状态码(HTTP Status Code) ...
- Intent对象(组件间的通信原理)
Intent对象是一种可以在运行时动态绑定组件的关键技术,通过使用Intent对象,可以告诉系统你想要实现什么样的操作,也就是Intent对象里面包含的请求内容,请求再由Android操作系统接收到, ...
- [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径
REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...
- [NOIP2013]华容道 题解(搜索)
[NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这 ...
- ~~Python文件简单操作~~
进击のpython Python文件操作 在说Python的文件操作之前 我们可以先思考一个问题 平时我们是怎么对电脑中的文件进行操作的呢? 打开电脑⇨找到文件⇨打开文件⇨读文件⇨修改文件⇨保存文件⇨ ...
- R018---RPA是什么东东?
1.缘起 这个问题,很多文章回答过,一直想站在客户角度写个答案,今天正好. 2.RPA的名字 RPA是英文Robotic Process Automation的缩写,中文爱翻译为“流程自动化机器人” ...
- 个人永久性免费-Excel催化剂功能第105波-批量调整不规范的图形对象到单一单元格内存储
在日常制表过程中,一个不得不面对的问题,许多的工作起点是基于其他人加工过的表格,无论自己多大的本领,面对不规范的其他人的制作的表格,经过自己的手,该擦的屁股还是要自己去亲手去擦,而带出来的也只会是一堆 ...
- 了解一下zookeeper,搭建单机版和集群版的环境玩玩,需要手稿的,留下邮箱
第一章:Zookeeper介绍 Zookeeper,动物管理员,是用来管理hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员. Apache Hbase和Apache Solr的分布式集群 ...
- Amdahl定律理解
其中,a为并行计算部分所占比例,k为并行处理的个数. 当1-a=0时,(没有串行,只有并行)最大加速比s=n: 当a=0时,(只有串行,没有并行)最小加速比s=1: 当k→∞时,s → 1 /(1-a ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...