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;
}