リンクをクリックして、完全なソリューションの概要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ラインがあります
-
最初の行
N/K+N%K
人々添字
0
〜N/K+N%K-1
-
その後、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
行の出力のために:次いで、ソート用インデックス次標的配列に応じて出力等を一つずつ
- 添字に対応し、高さに応じて並べ替え
0
〜N-1
- 例えば、行
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
- 行ごとに、最初のインデックスの一つ
first
、最後のインデックスlast
、m=last-first+1
- mが偶数である:から
last
-2 -2first+1
、およびからfirst
+2 +2にlast-1
- mが奇数である:から
last-1
-2 -2first+1
、およびからfirst
+2 +2にlast