20190301(小中大)
代码1
用一个数组vector<input> 来表示输入数据, n是个数,然后取出这组数据的第一个和最后一个数,它们两个是最值。若n是偶数,则取n/2, n/2+1下标的数相加除以2,四舍五入,若n是奇数,则取n/2下标的数作为中位数。
1 | //freopen("D://input.txt","r",stdin); |
我一开始犯了一个错误,没有考虑到,当中位数不整时,要保留一位小数。
20190302(二十四点)
代码1
由于n很小,所以我们可以用getline(cin, line) 函数来输入数据,不用考虑输入时间的问题。对于每一行输入line,我们用栈来实现运算,有两个栈:stack<int> stk1; stack<char> stk2 ,stk1用于存放数字,stk2用于存放操作符。还有一个map<char, int> mp 用于表示每个操作符的优先级,* / 的优先级为1,+ - 的优先级为0。每当输入的操作符优先级比stk2栈顶操作符的优先级相等或者小,则计算,否则,压栈。
1 | //freopen("D://input.txt","r",stdin); |
测试数据
1 | 10 |
20190303(损坏的RAID5)
代码1
输入的时候会指明哪些盘是存在的,那些没有指明的盘就是丢失的盘,根据输入,我们也可以确定每个磁盘有多少个半字节,设为len。一个块是4B,一个条带是s个块,根据数据布局规则,我们可以通过块号计算它在哪个磁盘,以及在哪个半字节,用getPos(int blockNum) 函数来计算,这个函数的过程为,根据块号blockNum计算条带号stripeNum = blockNum/s,然后index1 = stripeNum/(n-1)得到这个条带在磁盘的第几个条带处,以及在blockIndex = s*index1+(blockNum-blockNum/s*s)的块索引处。 以及index2 = stripeNum - index1*(n-1)表示P块后面的第index2+1处,P块的磁盘位置pPos = n-1-index1%n,因此这个块就在diskNum = (pPos+index2+1)%n的磁盘处。
getPos()函数得到的磁盘号和半字节,可以用于判断是否越界,是否是坏了的磁盘。
1 | //freopen("D://input.txt","r",stdin); |
测试数据
1 | 2 1 2 |
1 | 3 2 2 |
20190304(消息传递接口)
代码1
给出几个进程顺序执行的指令,判断是否死锁。pointer[n]表示每个进程正在执行第几条指令,初始时全为0,若遇到两个匹配的指令,才能向前推进,比如第0号进程第pointer[0]个指令是R1,第1号进程第pointer[1]个指令是S0,则0号进程和1号进程可以推进。那么如何在n个进程中找匹配的两个进程的指令呢?我想的是0和1,2,3…比较,然后1和2,3…比较,以此类推,一旦找到了,就推进,然后再继续开始找,等一个轮回结束了,再从1开始找,但是这个方法有点慢。
1 | //freopen("D://input.txt","r",stdin); |
60分。超时。
测试数据
1 | 3 2 |
1 | 2 3 |
代码2
我们可以不用一个一个比较。从0进程开始,看它当前的指令对应哪个进程,如R1对应1进程,S2对应2进程。若i进程的指令对应的进程在它后面而且有指令而且可以匹配,则推进,然后从0进程再开始找;若没有指令,则必定死锁;若有指令,但不匹配,则看i+1号进程,一直这样,直到最后一个进程,若遍历到最后一个进程后没有推进一次,则死锁。
1 | //freopen("D://input.txt","r",stdin); |
80分。运行超时
代码3
参考了别人的代码,我使用isBlocked标志位。bool isBlocked[],初始化为false,当一个进程a没有找到与之匹配的进程的指令后,就blocked,当a找到与之匹配的进程b后,a和b就可以推进,并且isBlocked设为false,然后a继续找直到找不到,然后设a的isBlocked为true。
1 | //freopen("D://input.txt","r",stdin); |
100分。