PTAグループ写真(25分)

無限の光を放つのは人間の心であり、無限の闇を生み出すのも人間の心であり、光と闇が絡み合って戦うこの世界は、懐かしくて無力な世界です。

集合写真を撮るとき、形成は非常に重要です。次のように、N人でK行を形成するルールを考えます。

  • 各行の人数はN / K(最も近い整数に切り捨て)である必要があり、追加の人物(存在する場合)はすべて最後の行にいます。

  • 後列のすべての人は、前列に立っている誰よりも短くてはなりません。

  • 各行で、最も高いものは中央の位置(位置(m / 2 + 1)として定義されます)に立っています。ここで、mはその行の合計人数です。除算結果は、最も近い整数);

  • 各行で、他の人は高さの昇順で行に入る必要があり、最も高いものの最初に右に、次に左に位置を取ります(たとえば、身長190、188の5人の場合、 186、175、および170の場合、最終的な編成は175、188、190、186、および170になります。ここでは、グループが正面を向いていると想定しているため、左側が中央にあるグループの右側になります。ポジション。);

  • 同じ高さの人が多い場合は、名前をアルファベット順(昇順)に並べる必要があり、名前の重複がないことが保証されています。

人々のグループの情報が与えられたら、あなたは彼らのフォーメーションを出力するプログラムを書くことになっています。

入力仕様:

各入力ファイルには1つのテストケースが含まれています。各テストケースの最初の行には、2人の正の整数N(≤104)、合計人数、およびK(≤10)、合計行数が含まれています。次に、N行が続き、それぞれが人の名前(スペースを含まない8文字以下の英字)とその人の身長([30、300]の整数)を示します。

出力仕様:

ケースごとに、フォーメーションを印刷します。つまり、K行で人の名前を印刷します。名前は1つのスペースで区切る必要がありますが、各行の終わりに余分なスペースがあってはなりません。注:グループに面しているため、後列の人は前列の人の上に印刷する必要があります。

入力例:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159

出力例:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1000100;
int n, k;
struct node {
    string name;
    int h;
} P[10010];
bool cmp(node a, node b) {
    if (a.h==b.h)
        return a.name<b.name;
    else
        return a.h>b.h;
}
int main() {
    cin>>n>>k;
    for (int i=0; i<n; i++)
        cin>>P[i].name>>P[i].h;
    sort(P, P+n, cmp);
    int ct=k,m,t=0;
    while(ct){
        if (ct==k)
            m=n-(n/k)*(k-1);
        else
            m=n/k;
        vector<node> jg(m);
        jg[m/2]=P[t];
        int j=m/2-1;
        for (int i=t+1; i<t+m; i+=2)
            jg[j--]=P[i];
        j=m/2+1;
        for(int i=t+2; i<t+m; i+=2)
            jg[j++] = P[i];
        cout<<jg[0].name;
        for (int i=1; i<m; i++)
            cout<<" "<<jg[i].name;
        cout<<endl;
        t+=m;
        ct--;
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44170305/article/details/108526627