zzuli--1812--sort(模拟水题)

1812: sort

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 158  Solved: 30

SubmitStatusWeb Board

Description

想必大家对排序已经很熟悉了,但是spy好像对排序不太熟悉,有一天,他看到这样一个关于排序的题目:

对于 k 个用空格分隔开的整数,依次为 n1, n2 … nk。请将所有下标不能被 3 但可以被 2 整除的数在这些数字原有的位置上进行升序排列,此外,将余下下标能被 3 整除的数在这些数字原有的位置上进行降序排列。

spy想了半天不知道怎么排序,你可以帮助他么?

Input

多组数据,每组数据一行,为k个小于1000的正整数,依次为 n1, n2 … nk。(1 <= k <= 100000)

Output

对于每组数据,输出排序后的结果。

Sample Input

1 3 4 2 10 6 8

Sample Output

1 2 6 3 10 4 8

这道题输入有点坑,其他都没啥

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define MAXN 200000
int a[MAXN],b[MAXN],c[MAXN];
int cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int k,i=0;
	char ch;
	while(~scanf("%d",&a[++i]))
	{
		ch=getchar();
		if(ch==' ') continue;
		//如果两个数据之间是' '的话就继续输入,负责就开始操作 
		else
		{
			int ans=0,cnt=0;
			for(int j=1;j<=i;j++)
			{
				if(j%2==0&&j%3!=0)
				b[cnt++]=a[j];
				else if(j%3==0)
				c[ans++]=a[j];
			}
			sort(b,b+cnt);
			sort(c,c+ans,cmp);
			int m=0,n=0,flot=0;
			for(int j=1;j<=i;j++)
			{
				if(flot)printf(" ");
				else flot++;
				if(j%2==0&&j%3!=0)
				printf("%d",b[m++]);
				else if(j%3==0)
				printf("%d",c[n++]);
				else printf("%d",a[j]);
			}
			printf("
");
		}
		memset(a,0,sizeof(a));//数据还是清零的好,没清零错了两次 
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		i=0;	
	}
	return 0;
}


原文地址:https://www.cnblogs.com/playboy307/p/5273628.html