PAT 1109 C++
C++ PAT
2023-09-14 09:13:22 时间
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.执行结果
但是上述的代码有一个段错误,我不是很理解。
相关文章
- C/C++每日一练(20230326) 二叉树专场(3)
- C语言/C++常见习题问答集锦(六十三) 之endl引发的思考
- C++ OCX控件开发后出现的注册问题
- C++编写Qt应用程序 如何实现交互效果?
- 使用Qt和C语言或者C++语言实现十、二、八、十六进制之间的转换(两种方法)
- C++中的queue类、QT中的QQueue类
- C++编码规范
- C/C++使用第三方库(Quicklz)进行数据解压缩(亲测可用)
- c++ 副本构造函数 函数实参 形参 c++入门经典 11 17 章
- C++ in Chromium 101 - Codelab 编程开始 bind 多线程 回调
- C++中的sort函数
- AI模型C++部署:TensorFlow2图像分类模型之金钱豹大战齐天大圣【OpenCV纯C++接口调用tensorflow生成的pb模型】【源码已开源】
- C++桌面及开始菜单快捷方式图标的更新
- C++11 函数模板的默认模板参数
- C++前置声明
- PAT 1078 C++ 版
- PAT 1142 C++版
- PAT 1134 C++ 版
- PAT 1126 Eulerian Path C++版
- PAT 1118 C++ 版
- PAT 1110 Complete Binary Tree C++ 版
- 【PAT 1151】 LCA in a Binary Tree C++版
- PAT 1014 C++版
- PAT 1072 C++版