解题代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct stu {
string name;
int hei;
} ;
bool cmp ( stu a, stu b) {
if ( a. hei != b. hei) return a. hei > b. hei;
return a. name < b. name;
}
bool cmp1 ( pair< string, int > a, pair< string, int > b) {
if ( a. second % 2 == 0 && b. second % 2 == 0 ) return a. second > b. second;
if ( a. second % 2 && b. second % 2 ) return a. second < b. second;
if ( a. second % 2 == 0 ) return true ;
return false ;
}
int main ( ) {
int n, k;
cin >> n >> k;
vector< stu> v ( n) ;
for ( int i = 0 ; i < n; i++ )
cin >> v[ i] . name >> v[ i] . hei;
sort ( v. begin ( ) , v. end ( ) , cmp) ;
vector< vector< pair< string, int > > > vt ( k) ;
for ( int i = 0 ; i < k; i++ ) {
int j = ( i == k - 1 ) ? 0 : n - n / k * ( i + 1 ) ;
int cnt = 1 ;
for ( ; j < n - n / k * i; j++ )
vt[ k - 1 - i] . push_back ( make_pair ( v[ j] . name, cnt++ ) ) ;
}
for ( int i = 0 ; i < k; i++ )
sort ( vt[ i] . begin ( ) , vt[ i] . end ( ) , cmp1) ;
for ( int i = 0 ; i < k; i++ ) {
for ( int j = 0 ; j < vt[ i] . size ( ) ; j++ ) {
if ( j) cout << " " ;
cout << vt[ i] [ j] . first;
}
cout << endl;
}
return 0 ;
}
测试结果
问题整理
1.这题我觉得我的方法比柳神的要好一点,有心人可以试着理解我的思路,重点在于如何把排好顺序的vector再拆成k个小vector,以及拆分后对同学进行身高排序的cmp1的编写上。