PAT A1109 Group Graph C++解法

1. 思路

  • 所有人从高到低排序(struct 实现)
  • 一共要输出k行,每行输出m个人,对m进行讨论,第一行 m = n/k + n%k,其余行都是m = n/k
  • 遍历排好序的stu结构体,每行输出m个
  • 对于每一行,用两个vector: left 和 right, 分别存放站在左边的人和右边的人,然后先打印left,再打印right

2. 代码(C++)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;

struct Student{
  string name;
  int height;
}stu[10010];

bool cmp(Student a, Student b)
{
  if(a.height != b.height) return a.height > b.height;
  else return strcmp(a.name.c_str(), b.name.c_str()) < 0;
}

int main(){
  int n, k;
  scanf("%d%d", &n, &k);
  for(int i = 1; i <= n; i++)
  {
    cin>>stu[i].name>>stu[i].height;
  }
  sort(stu+1, stu+n+1, cmp);

  int m;
  int start = 1, end = 0;
  for(int i = 1; i<=k; i++)
  {
    if(i == 1)
    {
      m = n/k + n%k;
      end  = m;
    }
    else
    {
      m = n/k;
      end += m;
    }
    int mid = (start + end) / 2 + 1;
    vector<string> left;
    vector<string> right;
    right.push_back(stu[start].name);
    start++;
    while(start <= end)
    {
      if(start <= end)
      {
        left.push_back(stu[start].name);
        start++;
      }
      if(start <= end)
      {
        right.push_back(stu[start].name);
        start++;
      }
    }
    bool is_left = false;
    for(int j = left.size()-1; j >=0; j--)
    {
      if(j != left.size() - 1) printf(" ");
      cout<<left[j];
      is_left = true;
    }
    for(int j = 0; j < right.size(); j++)
    {
      if(is_left)
      printf(" ");
      cout<<right[j];
    }
    if(i != k)
    printf("\n");

  }
  
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值