Description
想必大家对排序已经很熟悉了,但是spy好像对排序不太熟悉,有一天,他看到这样一个关于排序的题目:
对于 k 个用空格分隔开的整数,依次为 n1, n2 … nk。请将所有下标不能被 3 但可以被 2 整除的数在这些数字原有的位置上进行升序排列,此外,将余下下标能被 3 整除的数在这些数字原有的位置上进行降序排列。
spy想了半天不知道怎么排序,你可以帮助他么?
Input
多组数据,每组数据一行,为k个整数,依次为 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
今年郑大校赛的一道题,并不难,只是输入麻烦。
前两天在一本书上看的C++的stringstream类,感觉方便,于是就重新写了一遍,输入果然方便多了。
但是,书上也说了,stringstream用起来会有点慢,要慎用!但是对这一题而言,并没有超时~~
C++stringstream的用法
代码如下:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>
#define N 100009
using namespace std;
int num[N];
void Sort(int n)
{
int t;
for (int i = 1; i < n; i++)
{
if (i%3 && (i%2==0))
{
for (int j = i+1; j <= n; j++)
{
if (j%3 && (j%2==0))
{
if (num[i] > num[j])
{
t = num[i];
num[i] = num[j];
num[j] = t;
}
}
}
}
else if(i%3 == 0)
{
for (int j = i+1; j <= n; j++)
{
if((j%3==0) && num[i] < num[j])
{
t = num[i];
num[i] = num[j];
num[j] = t;
}
}
}
}
}
int main()
{
string s;
int i, a, n;
while(getline(cin, s))
{
stringstream stream(s);
i = 1;
while(stream >> a)
num[i++] = a;
n = i - 1;
Sort(n);
for (i = 1; i < n; i++)
cout << num[i] << ' ';
cout << num[i] << endl;
}
return 0;
}