-1055集合写真PAT B(25分)

リンクをクリックして、完全なソリューションの概要PAT B -AC

タイトル:
次の設計ルールの形成はK N個々の行をキューイング与えられたときに、グループの写真撮影、形成は非常に重要です。

  • N / K(切り捨て)の各列の数、最後の行に立ってすべての余分な人。
  • 最前列の誰より戻るすべての子は短くありません。
  • 各中間ステーション最高行(行数のmは、分割が切り捨て中間位置m / 2 + 1)。
  • 各行他の中間軸では、高さの非昇順によれば、第1の左及び右側に交互にエンキュー仲介(例えば190,188,186,175,170高さ5立って、形成175、 。188190186170)これは、あなたがカメラマンに直面していると仮定し、その左手には、仲介の権利です。
  • 同じ高さ以上の場合は、辞書式昇順の名前を押してください。ここには名前が重複することを確実にします。

今、人々の写真のセットが指定されると、プログラムの出力に彼らの形成を記述します。

入力フォーマット:
各入力テストを含みます。各テストケースは、最初の2つの正の整数N(≦10の列を与えられている。4、総数)とK(≤10、行の総数)。次いで、N行は、各行は、高さ(スペース、これ以上8以下の文字の長さを含まない)、人の名前を与える([30、300]間隔の整数)。

出力フォーマット:
出力は形成の写真を撮るために。それらの間のスペースで区切られたK個の行の名前は、行の末尾には、余分なスペースを有していなくてもよいこと。注:出力の上部にバック写真家、下部の最前列の出力に直面した場合。

サンプル入力:

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<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<sstream>
using namespace std;
//有的时候题目是一起做的,所以会有不需要的头文件

int cmp(pair<string,int>a,pair<string,int>b){
    if(a.second!=b.second)   return a.second>b.second;
    else return a.first<b.first;
}

void print_first_to_last(pair<string,int>student[],int first,int last)
{
    int m=last-first+1;
    int first_=(m%2==0)?(last):(last-1);
    int end_=(m%2==0)?(last-1):(last);

    int i=first_;
    while(i>=first+1)
    {
        cout<<student[i].first<<" ";
        i-=2;
    }
    i=first;
    while(1)
    {
        cout<<student[i].first;
        i+=2;
        if(i<=end_) cout<<" ";
        else
        {
            cout<<endl;
            return;
        }
    }
}


int main()
{
    int N,K;
    cin>>N>>K;
    pair<string,int>student[N];
    for(int i=0;i<N;i++)
    {
        string name;
        int height;
        cin>>name>>height;
        student[i]=make_pair(name,height);
    }
    sort(student,student+N,cmp);

    int num_line=N/K;
    print_first_to_last(student,0,num_line+N%K-1);
    for(int line=2;line<=K;line++)
        print_first_to_last(student, N%K+(line-1)*num_line, N%K + line*num_line -1);

    return 0;
}

私の考え:

各列の範囲を決定します:N個体の合計は、最初の行に加えて、Kラインがあります

  1. 最初の行N/K+N%K人々

    添字0N/K+N%K-1

  2. その後、2〜Kラインそれぞれが持っているN/K人々を

    最初のためlineの行、
    最初のインデックスはN/K + N%K + (line-2)*N/K= N%K + (line-1)*N/K
    最後のインデックスをN%K + (line-1)*N/K + N/K-1=N%K + line*N/K -1

行の出力のために:次いで、ソート用インデックス次標的配列に応じて出力等を一つずつ

  1. 添字に対応し、高さに応じて並べ替え0N-1
  2. 例えば、行m番号は、2つの場合があります
  • mが偶数である:(M-1)... 1 0 2 4 3 ...(M-2)

    • 最初は、次のとおりです。最後の1
    • :で中間停止1(最初のものの後に)
    • 最後のものは次のとおりです。A前の最後の1
  • mが奇数である:(M-2)... 3 1 0 2 4 ...(M-3)、(M-1)

    • 最初は、次のとおりです。A前の最後の1
    • :で中間停止1(最初のものの後に)
    • 最後のものは次のとおりです。最後の1
  1. 行ごとに、最初のインデックスの一つfirst、最後のインデックスlastm=last-first+1
  • mが偶数である:からlast-2 -2 first+1、およびからfirst+2 +2にlast-1
  • mが奇数である:からlast-1-2 -2 first+1、およびからfirst+2 +2にlast
公開された82元の記事 ウォンの賞賛1 ビュー1680

おすすめ

転載: blog.csdn.net/qq_34451909/article/details/104854930