版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86549974
PAT 1109
C++
版
1.题意
2.分析
3.代码
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<iostream>
#define N 10001
using namespace std;
//新建一个student 结构体,用于保存student的信息
struct student
{
int height;
char name[10]; //no more than 8 English letters without space
};
//比较函数,对结构体进行排序
int cmp(student s1,student s2){
if(s1.height!=s2.height){
return s1.height > s2.height;
}
else if(s1.height == s2.height){
return strcmp(s1.name,s2.name) < 0;
}
}
int main(){
int number;//the total number of people
int k;//the total number of rows
int height;
scanf("%d%d",&number,&k);
//printf("number = %d,k = %d\n",number,k);
int i = 0,j = 0;
student stu[number];
for(i = 0;i < number ;i++){
scanf("%s %d",&stu[i].name,&stu[i].height);
}
sort(stu,stu+number,cmp);
//printf("=======after sort=======\n");
// for(i = 0;i< number;i++){
// printf("name = %s,height = %d\n",stu[i].name,stu[i].height);
// }
int rest ;
//printf("rest = %d\n",rest);//print the rest
//输出队尾
int mid ;
int flag = 0;//表示是否只需要站一排 ,初始化时,只站成1排
if(number / k > 1) {
flag = 1;//说明需要站成1+排
rest = number % k + k; //求出最后一排的人数
}
else{
rest = number;//最后一排 = 第一排
}
student result[rest];//定义一个输出数组,用于盛放排队后的人
//=================计算最后一排
mid = rest / 2;
int offset = 1;
result[mid] = stu[0];//最高个是第一一个人
//printf("mid = %d\n",mid);
for(i = 1;i < rest ; i += 2){//输出左边的人
// printf("stu[i] = %s\n",stu[i].name);
// printf("mid - offset = %d\n",mid - offset);
result[mid - offset ] = stu[i];
offset ++;
}
offset = 1;
for(i = 2;i < rest ;i += 2){//输出右边的人
// printf("stu[i] = %s\n",stu[i].name);
// printf("mid + offset = %d\n",mid+offset);
result[mid + offset] = stu[i];
offset ++;
}
//输出该result中的内容
for(int i = 0;i < rest;i++){
if(i!=rest - 1) {
printf("%s ",result[i].name);
}
else{
printf("%s\n",result[i].name);
}
}
if(flag == 1){ // 如果不止一排,则计算除第一排的任一排 ----------
mid = k /2;
//printf("mid = %d\n",mid);
int rows = number / k; //计算 number个人需要站成多少行
int cur = rest ;//表示stu 当前的下标
for(i = 0;i < rows -1 ;i++){
//给最高个赋值
result[mid] = stu[cur];
//轮流给两边赋值
offset = 1;
for(j = 1;j < rows;j+=2){
// printf("mid - offset = %d\n",mid - offset );
result[mid - offset] = stu[cur + j];
offset ++;
}
offset = 1;
for(j = 2;j < rows;j+=2){
// printf("mid + offset = %d\n",mid + offset );
// printf("name = %s\n",stu[cur+j].name);
result[mid + offset] = stu[cur + j];
offset ++;
}
cur += k;//往后移k位
//printf("cur = %d\n",cur);
//输出
for(int i = 0;i < k ; i++){
if(i!= k - 1) {
printf("%s ",result[i].name);
}
else{
printf("%s\n",result[i].name);
}
}
}
}
return 0;
}
/*
10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159
1 10
Tom 188
2 2
Amy 160
John 159
4 2
Ann 168
Bob 175
Nick 186
Amy 160
4 6
Ann 168
Bob 175
Nick 186
Amy 160
*/
4.执行结果
但是上述的代码有一个段错误,我不是很理解。