PAT 1109 C++

版权声明:如若转载,请联系作者。 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.执行结果

但是上述的代码有一个段错误,我不是很理解。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86549974
今日推荐