pat解题报告【1074】

1074. Reversing Linked List (25)

时间限制

300 ms

内存限制

32000 kB

代码长度限制

16000 B

判题程序

Standard

作者

CHEN, Yue

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L.  For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case.  For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length
of the sublist to be reversed.  The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, andNext is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list.  Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

反转链表,但是此链表非彼链表。题目意思是说链表的节点由两个地址一个数值组成,给定一个数k,那么链表里面以k个节点为一组进行反转,但是要保证各节点之间的地址相连无误。

刚开始的思路是:用字符串来存储地址,因为地址一定是5位数,结果最后倒数第二个点会超时。看来读入一个类真的很费时间,后来改成了char[ ]虽然超时没了,但是判断起来还是很不方便。后来看了别人的代码发现这么个东西:printf("%05d",n);用5位长度输出一个数字,少的部分用0来填充。这样就可以用int来存地址,映射完全可以用数组来替代。

除了上述数据结构的简化,这个题目还有几点要注意:

【1】输入的点可能有无用的点,这些点要忽略。

【2】输出-1的时候前面没有0

【3】反转的时候节点本身的地址是不变的,但是下一个地址要变,这里我用了输出两次本次地址来替代。

【4】注意反转两轮及以上的情况。

Ac代码:

// pat-1074-ans.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"iostream"
#include"stdio.h"
#include "deque"
using namespace std;
class node{
public:
	int addr;
	int val;
	int next;
	node(int a,int v,int n):addr(a),val(v),next(n){}
	node(){}
};
node an[100000];
deque<node> ans;
int time=0;
void output(deque<node>& ans)
{
	if (time>0&&!ans.empty())
	{
		printf("%05d\n",ans.back().addr);
		time--;
	}
	int index=ans.size()-2;
	int temp=ans.back().next;
	while (!ans.empty())
	{
		if (index==-1)//最后一个
		{
			printf("%05d",ans.back().addr);
			printf(" %d ",ans.back().val);

		    time++;
		}
		else
		{
			printf("%05d",ans.back().addr);
			printf(" %d ",ans.back().val);
			if (ans.at(index).addr==-1)
			{
				printf("%d\n",ans.at(index).addr);
			}else
				printf("%05d\n",ans.at(index).addr);
		}

		ans.pop_back();
		index-=1;
	}
}
void output_front(deque<node>& ans)
{

	if (time>0&&!ans.empty())
	{
		printf("%05d\n",ans.front().addr);
		time--;
	}
	while (!ans.empty())
	{
		printf("%05d",ans.front().addr);
		printf(" %d ",ans.front().val);
		if (ans.back().next==-1)
		{
			printf("%d\n",ans.front().next);
		}else
			printf("%05d\n",ans.front().next);
		ans.pop_front();
	}
}
int main()
{
	int n=0,k=0,head=0;
	cin>>head>>n>>k;
	int addr=0,val=0,next=0;
	for (int i=0;i<n;i++)
	{
		cin>>addr>>val>>next;
		an[addr].addr=addr;
		an[addr].val=val;
		an[addr].next=next;
	}
	int cnt=0;
	int index=head;
	bool apend=false;
	while(cnt<n)
	{
		next=an[index].next;
		node tempn;
		tempn.addr=an[index].addr;
		tempn.val=an[index].val;
		tempn.next=next;
		ans.push_back(tempn);
		cnt++;
		if (cnt%k==0)
		{
			output(ans);
		}
		if (next==-1)
		{    

			if (ans.empty())
			{
				apend=true;
			}
			output_front(ans);
			if (apend)
			{
				printf("-1\n");
			}

			break;
		}
		index=next;
	}
	return 0;
}

pat解题报告【1074】,布布扣,bubuko.com

时间: 2024-12-25 08:43:39

pat解题报告【1074】的相关文章

pat解题报告【1073】

1073. Scientific Notation (20) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming Scientific notation is the way that scientists easily handle very large numbers or very small numbers.  The notation matches the regular expression [

pat解题报告【1078】

1078. Hashing (25) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers.  The hash fun

pat解题报告【1082】

1082. Read Number in Chinese (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way.  Output "Fu" first if it is negative. 

2016.8.29 解题报告之我会做的题都是简单题

老规矩,要相关资料联系邮箱: 考试分析: 1.  画图确定性质,其实我开始也打算用二进制判重的,但进制题一般不会使状态无法用longlong表示出来,然后那种确定了某种状态以后就排除了无关变量,直接取最优的思路也很不错: 2.  最早入手的题以及死在上面的题,还想了了很久的复杂度证明和对拍,无话可说,希望这次AK之路被断能让我涨一点记性,以后要抓住脑海里的每一点信息(本来还想了longlong这个问题的): 3.  找性质,把在线决策问题转化为线性判断类问题,排除任务之间有一点橡树的关系的无关干

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的