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的主要内容,如果未能解决你的问题,请参考以下文章

PAT(甲级)2019年冬季考试 7-4 Cartesian Tree

PAT(甲级)2018年冬季考试

PAT甲级2019冬季考试题解

PAT2021年冬季考试甲级,摸鱼游记92分

PAT2021年冬季考试甲级,摸鱼游记92分

PAT(甲级)2018年冬季考试 7-1 Google Recruitment