zoukankan      html  css  js  c++  java
  • zzuli 1812: sort 排序

    1812: sort

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 352  Solved: 216

    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<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    const int maxn=100005;
    struct node {
        int num;
        int pos;
        int flag;
        node () {
            flag=0;
        }
    }ans[maxn];
    int bns[maxn],cns[maxn];
    bool cmpbns(const int &a, const int &b) {
        return a<b;
    }
    bool cmpcns(const int &a, const int &b) {
        return a>b;
    }
    int main() {
        int index,bnspos,cnspos;bnspos=cnspos=0;index=1;
        while(~scanf("%d",&ans[index++].num)) {
            while(getchar()!='
    ') {
                scanf("%d",&ans[index++].num);
            }
            for(int i=1;i<index;++i) {
                if((i%2==0)&&(i%3!=0)) {
                    bns[bnspos]=ans[i].num;
                    ans[i].flag=-1;
                    ans[i].pos=bnspos;
                    ++bnspos;
                } else if(i%3==0) {
                    cns[cnspos]=ans[i].num;
                    ans[i].flag=1;
                    ans[i].pos=cnspos;
                    ++cnspos;
                }
            }
            sort(bns,bns+bnspos,cmpbns);
            sort(cns,cns+cnspos,cmpcns);
            for(int i=0;i<index;++i) {
                if(ans[i].flag==0) continue;
                else if(ans[i].flag==-1) {
                    ans[i].num=bns[ans[i].pos];
                } else if(ans[i].flag==1) {
                    ans[i].num=cns[ans[i].pos];
                }
            }
            for(int i=1;i<index-1;++i) printf("%d ",ans[i].num);
            printf("%d
    ",ans[index-1].num);
            for(int i=1;i<index;++i) ans[i].flag=0;
            cnspos=bnspos=0;index=1;
        }
        return 0;
    }
    


  • 相关阅读:
    P2572 [SCOI2010]序列操作
    P2787 语文1(chin1)- 理理思维
    P1835 素数密度_NOI导刊2011提高(04)
    P3942 将军令
    P1273 有线电视网
    U45490 还没想好名字的题Ⅱ
    U40620 还没想好名字的题
    P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    T51071 Tony到死都想不出の数学题
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7775985.html
Copyright © 2011-2022 走看看