PAT(甲级)2019年冬季考试 7-2 Block Reversing
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2019年冬季考试 7-2 Block Reversing相关的知识,希望对你有一定的参考价值。
这题是做过的,B1025,我还总结过,果然早晚复相逢,只改了一点点,见1025 反转链表。
点睛之笔是结构体数组的哈希,地址既做下标,又有实际含义,妙啊。
node[add].add = add;
当时应该是排序函数cmp写得很溜,今天下午模拟时就在那打算全靠hash,代码十分粗暴,得了20/30,也没兴趣再看错哪了。
加一个no属性用于排序是很好的。
此题的输出有点绕,主要是
1 要考虑最后一块可能不满K个。
2 要考虑-1作为唯一一个不是5位的地址会在何出出现。
总体思路没错的话,剩下一些小细节多注意就能拿满分。
AC代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cstring>
using namespace std;
const int maxn = 100010;
const int SUP = 2000000000;
struct Node{
int data,add,next;
int no = maxn;
}node[maxn];
bool cmp(Node a,Node b){
return a.no<b.no;
}
int main(){
int headAdd,n,K;
scanf("%d %d %d",&headAdd,&n,&K);
int add,data,next;
for(int i=0;i<n;i++){
scanf("%d %d %d",&add,&data,&next);
node[add].add = add;
node[add].data = data;
node[add].next = next;
}
//现在要把no属性补充上,同时筛出无效结点
int cnt = 0;
while(headAdd!=-1){
node[headAdd].no = cnt;
cnt ++;
headAdd = node[headAdd].next;
}
sort(node,node+maxn,cmp);
//开始输出
int bNum = cnt/K;//块数
if(cnt%K!=0)bNum ++;
if(bNum==1){
for(int i=0;i<cnt;i++){
printf("%05d %d ",node[i].add,node[i].data);
if(i!=cnt-1)printf("%05d\\n",node[i+1].add);
else printf("-1\\n");
}
return 0;
}
for(int b=bNum;b>=1;b--){
if(b==bNum){
int num = cnt - (bNum-1)*K;
// printf("n = %d\\n",num);
for(int i=0;i<num;i++){
int j = (b-1)*K+i;
printf("%05d %d ",node[j].add,node[j].data);
if(i!=num-1)printf("%05d\\n",node[j+1].add);
else printf("%05d\\n",node[(b-2)*K].add);
}
}else if(b==1){
for(int i=0;i<K;i++){
int j = (b-1)*K+i;
printf("%05d %d ",node[j].add,node[j].data);
if(i!=K-1)printf("%05d\\n",node[j+1].add);
else printf("%d\\n",-1);
}
}else{
for(int i=0;i<K;i++){
int j = (b-1)*K+i;
printf("%05d %d ",node[j].add,node[j].data);
if(i!=K-1)printf("%05d\\n",node[j+1].add);
else printf("%05d\\n",node[(b-2)*K].add);
}
}
}
return 0;
}
结果
以上是关于PAT(甲级)2019年冬季考试 7-2 Block Reversing的主要内容,如果未能解决你的问题,请参考以下文章