PAT A1109 Group Photo
输入保存身高和名字,排序;计算每排多少人,最后一排的人数注意一下 然后从最后一排开始,先找中间位置放人,然后左边一个、右边一个直到放满
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
struct People{
string name;
int height;
} ;
vector< People> vp;
vector< vector< string> > vv;
bool cmp ( People p1, People p2) {
return p1. height != p2. height ? p1. height > p2. height : p1. name < p2. name;
}
int main ( ) {
int N, K;
cin >> N >> K;
vp. resize ( N) ;
vv. resize ( K) ;
for ( int i = 0 ; i < N; i ++ ) cin >> vp[ i] . name >> vp[ i] . height;
sort ( vp. begin ( ) , vp. end ( ) , cmp) ;
int row_num = floor ( N / K) ;
int lastrow_num = N - ( K - 1 ) * row_num;
int cnt = 0 ;
for ( int i = 0 ; i < K; i ++ ) {
int num;
if ( i == 0 ) num = lastrow_num;
else num = row_num;
vv[ i] . resize ( num) ;
int mid = floor ( num / 2 + 1 ) - 1 ;
vv[ i] [ mid] = vp[ cnt ++ ] . name;
for ( int j = 1 ; mid - j >= 0 || mid + j < num; j ++ ) {
if ( mid - j >= 0 ) vv[ i] [ mid - j] = vp[ cnt ++ ] . name;
if ( mid + j < num) vv[ i] [ mid + j] = vp[ cnt ++ ] . name;
}
}
for ( int i = 0 ; i < K; i ++ ) {
for ( int j = 0 ; j < vv[ i] . size ( ) ; j ++ ) {
cout << vv[ i] [ j] ;
if ( j < vv[ i] . size ( ) - 1 ) cout << ' ' ;
else cout << endl;
}
}
return 0 ;
}