zoukankan      html  css  js  c++  java
  • 1055 集体照 (25 分)C语言

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下:

    • 每排人数为 N/K(向下取整),多出来的人全部站在最后一排;
    • 后排所有人的个子都不比前排任何人矮;
    • 每排中最高者站中间(中间位置为 m/2+1,其中 m 为该排人数,除法向下取整);
    • 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);
    • 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

    现给定一组拍照人,请编写程序输出他们的队形。

    输入格式:
    每个输入包含 1 个测试用例。每个测试用例第 1 行给出两个正整数 N(≤10^​4,总人数)和 K(≤10,总排数)。随后 N 行,每行给出一个人的名字(不包含空格、长度不超过 8 个英文字母)和身高([30, 300] 区间内的整数)。

    输出格式:
    输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

    输入样例:

    10 3
    Tom 188
    Mike 170
    Eva 168
    Tim 160
    Joe 190
    Ann 168
    Bob 175
    Nick 186
    Amy 160
    John 159
    

    输出样例:

    Bob Tom Joe Nick
    Ann Mike Eva
    Tim Amy John
    

    思路

    • 由于输入是成对的,身高与姓名一一对应,因此需要使用结构体来绑定这两个变量。
    typedef struct persons{
    	char name[9];
    	int height;
    }person;
    
    • 根据题目要求,身高需要从大到小进行排列,并且当身高相同的时候,按名字的字典序升序排列,因此定义的比较函数如下:
    int paixu(const void *a,const void *b){
    	person A=*(person *)a;
    	person B=*(person *)b;
    	if(A.height != B.height){
    		return B.height - A.height;
    	}else{
    		return strcmp(A.name,B.name);
    	}
    }
    
    • 然后就是很常规的主函数。
    • 排完序后,需要确定每一行排多少人数,多出来的人(N % K)排在第一排即可。然后从中间位置开始,左边右边分别填好即可。
    #include <stdio.h>
    typedef struct persons{
    	char name[9];
    	int height;
    }person;//身高从大到小排序 , 字母从小到大
    int paixu(const void *a,const void *b){
    	person A=*(person *)a;
    	person B=*(person *)b;
    	if(A.height != B.height){
    		return B.height - A.height;
    	}else{
    		return strcmp(A.name,B.name);
    	}
    }
    int main(){
    	int n,k,i,j,height;
    	scanf("%d %d",&n,&k);
    	person arr[n];
    	for(i=0;i<n;i++){
    		scanf("%s %d",arr[i].name,&arr[i].height);
    	}
    	qsort(arr,n,sizeof(arr[0]),paixu);
    	int xuhao=0;//当前排到总共第几位序号
    	for(j=0;j<k;j++){
    		int m;//每排m人
    		if(j==0){
    			m=n/k+n%k;
    		}else{
    			m=n/k;
    		}
    		for(i=0;i<m/2;i++){//输出左边 
    			printf("%s ",arr[xuhao+(m/2-i)*2-1].name);
    		}
    		printf("%s",arr[xuhao].name);//输出中间
    		if(m!=1){
    			printf(" ");
    		}
    		for(i=m/2+1;i<m;i++){//输出右边 
    			printf("%s",arr[xuhao+(i-m/2)*2].name);
    			if(i!=m-1){
    				printf(" ");
    			} 
    		}
    		if(j!=k-1){
    			printf("
    ");
    		}
    		xuhao=xuhao+m; 
    	}
    	return 0;
    } 
    
    欢迎查阅
  • 相关阅读:
    GitHub 教程【转】
    Github 教程
    Excel 多个单元格输入同样内容
    寻找问题远比解决问题重要!
    蒲公英: 一个提供App 存储、分发、Bug管理的网站
    Dacapao 实验集(9.12 版本) 能不能给个网址?【内存分析实验】
    软件测试思维导图[ZZ]
    程序员、技术领导、管理者各有烦恼,你占了几条?ZZ
    r test
    mooctest项目总结 【转载】
  • 原文地址:https://www.cnblogs.com/gh110/p/12158192.html
Copyright © 2011-2022 走看看