天天看點

PAT乙級1055

1055. 集體照 (25)

時間限制

400 ms

記憶體限制

65536 kB

代碼長度限制

8000 B

判題程式

Standard

作者

CHEN, Yue

拍集體照時隊形很重要,這裡對給定的N個人K排的隊形設計排隊規則如下:

  • 每排人數為N/K(向下取整),多出來的人全部站在最後一排;
  • 後排所有人的個子都不比前排任何人矮;
  • 每排中最高者站中間(中間位置為m/2+1,其中m為該排人數,除法向下取整);
  • 每排其他人以中間人為軸,按身高非增序,先右後左交替入隊站在中間人的兩側(例如5人身高為190、188、186、175、170,則隊形為175、188、190、186、170。這裡假設你面對拍照者,是以你的左邊是中間人的右邊);
  • 若多人身高相同,則按名字的字典序升序排列。這裡保證無重名。

現給定一組拍照人,請編寫程式輸出他們的隊形。

輸入格式:

每個輸入包含1個測試用例。每個測試用例第1行給出兩個正整數N(<=10000,總人數)和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<vector>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<iomanip>
using namespace std;
struct stu
{
  string name;
  int height;
  bool operator<(stu s)
  {
    if (height != s.height)
      return height > s.height;
    else
      return name < s.name;
  }//重載小于号
};
int main()
{
  int N, K;
  cin >> N >> K;
  stu t;
  deque<stu> v;//雙端隊列
  int N1 = N;
  while (N--)
  {
    cin >> t.name >> t.height;
    v.push_back(t);
  }
  sort(v.begin(), v.end()); 
  N = N1;
  int p = N / K;
  int lastrow = N - p*(K - 1);
  deque<stu> vv;
  for (int i = 0; i < v.size()||vv.size(); i++)
  {
    if (i < lastrow)//設定lastrow對最後一排進行特殊處理
    {
      if (i % 2 == 0)
        vv.push_back(v[i]);
      else
        vv.push_front(v[i]);//利用雙端隊列的特性,可以往前插
    }
    else
    {
      if (i == lastrow||vv.size()==p)//當一排排完時
      {
        for (int j = 0; j < vv.size(); j++)
        {
          cout << vv[j].name;
          if (j != vv.size() - 1)
            cout << " ";
          else
            cout << endl;
        }
        vv.clear();//一定要記得清空
      }
      if(i<v.size())
      if (vv.size() % 2 == 0)//交替插入
        vv.push_back(v[i]);
      else
        vv.push_front(v[i]);
    }
  }
  
  return 0;
}      

繼續閱讀