12010 解密QQ号(队列)

标题:

解密QQ号

标签: 数据结构 队列
详情: 新学期开始了,小哈是小哼的新同,小哼向小哈询问QQ号,小哈当然不会直接告诉小哼。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ啦。现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 7 5 8 9 2 4”。解密后小哈的QQ号应该是“6 1 5 9 4 7 2 8 3”。
输入格式:
只有2行
第1行有一个整数n (1<=n<=100000)
第2行有n个整数为加密过的QQ号,每个整数之间用空格隔开。每个整数在1~9之间。
输出格式:
只有一行,输出解密后的QQ号。
限制: 每个测试点1秒
50%的数据1<=n<=10000
100%的数据1<=n<=100000
样例:

输入

9
6 3 1 7 5 8 9 2 4

输出

6 1 5 9 4 7 2 8 3

这一题刚开始按照书上两种方法模拟个一遍队列,但是都有一组数据是过不去的,我也没找到是什么原因。

贴出来大家可以找一下原因。本题实现过程过于简单,就不用写题解了。

代码1:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
struct que
{
	int date[100000];
	int head;
	int tail;
};
int main()
{
	int n;
	scanf("%d",&n);
	struct que q;
	q.head=1;
	q.tail=1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&q.date[q.tail]);
		q.tail++;
	}
	while(q.head<q.tail)
	{
		printf("%d ",q.date[q.head]);
		q.head++;
		q.date[q.tail]=q.date[q.head];
		q.head++;
		q.tail++;
	} 
	return 0;
} 

代码2:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100001];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int head=1,tail=n+1;
	while(head<tail)
	{
		printf("%d ",a[head]);
		head++;
		a[tail]=a[head];
		head++;
		tail++;
	}
	return 0;
} 

这个题最后我用STL里面的队列实现的,一次就A了。

AC代码:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
	queue<int>q;
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		q.push(a[i]);
	} 
	while(q.size())
	{
		printf("%d ",q.front());//获取队首元素,q.back()获取队尾元素
		q.pop();
		q.push(q.front());
		q.pop();
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/81387337