1812: sort
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }