PAT 1055 集体照 25分

65 阅读1分钟

题目:1055 集体照 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:55_哔哩哔哩_bilibili

#include<bits/stdc++.h>
using namespace std;
struct student
{
  string name;
    int height;
}S[1010];

bool cmp(student a,student b)
{
  if(a.height==b.height)return a.name<b.name;
return a.height>b.height;
}

int cnt[1010];
int main()
{
    int n,k;cin>>n>>k;
    for(int i=0;i<n;i++)cin>>S[i].name>>S[i].height;

    sort(S,S+n,cmp);

    for(int i=0;i<k;i++)cnt[i]=n/k;
    cnt[k-1]+=n%k;
   
    //输出
    int index=0;
    for(int i=k-1;i>=0;i--)//从最后一行开始
    {
          string temp=S[index++].name;  //取最高的那个到中间
          int flag=0;
 
    for(int j=2;j<=cnt[i];j++) //从2开始是因为最高的那个已经被取了
      {
           //向左插
            if(!flag)temp=S[index++].name+" "+temp,flag=1;
            else temp=temp+" "+S[index++].name,flag=0;
      }
     cout<<temp<<endl;
    }

    return 0;
}

image.png

数组开大一点

#include<bits/stdc++.h>
using namespace std;
struct student
{
  string name;
    int height;
}S[10000];

bool cmp(student a,student b)
{
  if(a.height==b.height)return a.name<b.name;
return a.height>b.height;
}

int cnt[10000];
int main()
{
    int n,k;cin>>n>>k;
    for(int i=0;i<n;i++)cin>>S[i].name>>S[i].height;

    sort(S,S+n,cmp);

    for(int i=0;i<k;i++)cnt[i]=n/k;
    cnt[k-1]+=n%k;
   
    //输出
    int index=0;
    for(int i=k-1;i>=0;i--)//从最后一行开始
    {
          string temp=S[index++].name;  //取最高的那个到中间
          int flag=0;
 
    for(int j=2;j<=cnt[i];j++) //从2开始是因为最高的那个已经被取了
      {
           //向左插
            if(!flag)temp=S[index++].name+" "+temp,flag=1;
            else temp=temp+" "+S[index++].name,flag=0;
      }
     cout<<temp<<endl;
    }

    return 0;
}

image.png