Sicily 1775. Simple Sort Description

本文介绍了一种名为SimpleSort的排序算法实现细节。该算法通过构建结构体存储元素及其位置信息,利用两个比较函数进行排序。文章详细解释了如何在保持原有位置信息的同时,通过多次比较完成排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Simple Sort还算Simple,但是相当麻烦:既要实行多次不同条件下的比较,还要保持着原有的位置信息。想到的方法主要有两个:一个是复制数组,在新的数组上实行比较,这样最初的信息仍然保留在原本的数组上;一个是构建结构体,将其位置信息作为变量存储下来,方便以后使用,同理另外构建一个同步数组来储存信息也可。我用了后面一种方法,忘了当时是出于怎么原因,不但很娱乐地构建了嵌套着结构体的结构体的一个东西,还很嚣张地写了两个cmp函数来使用sort函数……这道题只要细心留意比较的优先级就可以了,另外输出时需要清晰地记得存储位置信息的变量在哪里,其余的应该不是问题。

Run Time: 0.01sec
Run Memory: 320KB
Code length: 2132Bytes
Submit Time: 2011-11-24 17:38:18

// Problem#: 1775
// Submission#: 1001635
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int T, N, M, Q;

struct Prio {
    int index;
    int level;
    friend bool cmpPrio( const Prio& p1, const Prio& p2 );
} prio[ 10 ];

bool cmpPrio( const Prio& p1, const Prio& p2 ) {
    return p1.level < p2.level;
}


struct Data {
    int entry;
    Prio item[ 10 ];
    int find( int n ) {
        for ( int i = 0; i < M; i++ ) {
            if ( item[ i ].index == n )
                return i;
        }
    }
    friend bool cmpData( const Data& d1, const Data& d2 );
} data[ 100 ];

bool cmpData( const Data& d1, const Data& d2 ) {
    int i;
    for ( i = 0; i < M; i++) {
        if ( d1.item[ i ].level < d2.item[ i ].level )
            return true;
        else if ( d1.item[ i ].level > d2.item[ i ].level )
            return false;
    }
    return d1.entry < d2.entry;
}


int main()
{
    int i, j, k, l;
    Prio temp;
    
    cin >> T;
    while ( T-- ) {
        cin >> N >> M;
        for ( i = 0; i < N; i++ ) {
            data[ i ].entry = i;
            for ( j = 0; j < M; j++ ) {
                data[ i ].item[ j ].index= j;
                scanf( "%d", &data[ i ].item[ j ].level );
            }
        }
        
        cin >> Q;
        for ( k = 0; k < Q; k++ ) {
            for ( i = 0; i < M; i++ ) {
                prio[ i ].index = i;
                scanf( "%d", &prio[ i ].level );
            }
            sort( prio, prio + M, cmpPrio );
            
            for ( i = 0; i < N; i++ ) {
                for ( j = 0; j < M; j++ ) {
                    l = data[ i ].find( prio[ j ].index );
                    temp = data[ i ].item[ j ];
                    data[ i ].item[ j ] = data[ i ].item[ l ];
                    data[ i ].item[ l ] = temp;
                }
            }
            sort( data, data + N, cmpData );
            
            for ( i = 0; i < N - 1; i++ )
                cout << data[ i ].entry << " ";
            cout << data[ i ].entry << endl;
        }
    }
    
    return 0;
    
}                                 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值