1812: sort
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 178 Solved: 35
Submit Status Web 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
很简单的一道题,坑点在于:里面会出现非数字的东西啊啊啊啊啊啊啊啊!!!!!!
ac代码:
很简单的一道题,坑点在于:里面会出现非数字的东西啊啊啊啊啊啊啊啊!!!!!!
ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#define MAXN 1000010
#define LL long long
#define INF 0xfffffff
#define fab(x) (x)>0?(x):(-x)
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#include<iostream>
#include<algorithm>
using namespace std;
char s[MAXN];
int a[MAXN];
int b[MAXN];
int c[MAXN];
int num[MAXN];
bool cmp(int aa,int bb)
{
return aa>bb;
}
int main()
{
int i;
int j=0;
while(gets(s))
{
int len=strlen(s);
int n=1;
int k=1;
mem(num);
int bz=0;
int flag=0;
for(i=len-1;i>=0;i--)
{
if(s[i]==' ')
{
if(flag==0)
continue;
if(bz==0)
{
bz=1;
k=1;
n++;
}
continue;
}
flag=1;
if(s[i]<'0'||s[i]>'9')
continue;
num[n]=k*(s[i]-'0')+num[n];
k*=10;
bz=0;
}
if(s[0]==' '&&num[n]==0)
n=n;
else
n++;
for(i=1;i<n;i++)
a[i]=num[n-i];
int cnt1=0;
int cnt2=0;
for(i=1;i<n;i++)
{
if(i%2==0&&i%3)
{
b[cnt1]=a[i];
cnt1++;
}
else if(i%3==0)
{
c[cnt2]=a[i];
cnt2++;
}
}
sort(b,b+cnt1,cmp);
sort(c,c+cnt2);
cnt1--;cnt2--;
for(i=1;i<n;i++)
{
if(i%2==0&&i%3)
printf(i==n-1?"%d\n":"%d ",b[cnt1--]);
else if(i%3==0)
printf(i==n-1?"%d\n":"%d ",c[cnt2--]);
else
printf(i==n-1?"%d\n":"%d ",a[i]);
}
}
return 0;
}