PAT B1055集合写真(25点)

ここに画像の説明を挿入
少し面倒なシミュレーションの質問です。ACを書くのに40分かかりました。私のアプローチは、最初に最後の行を取り出して別々に出力し、次に最初の数行の人数が同じになることです。新しい行を開くことができます。それを格納する配列。特定の実装詳細は少し面倒なので、コードを自分で見ることができます。

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct Student{
    
    
	char name[10];
	int h;
};

bool cmp(Student s1, Student s2){
    
    
	if(s1.h != s2.h) return s1.h > s2.h;
	return strcmp(s1.name,s2.name) < 0;
}

int main(){
    
    
	int n, k;
	scanf("%d %d", &n, &k);
	
	Student stu[n];
	for(int i=0; i<n; i++){
    
    
		scanf("%s %d", stu[i].name, &stu[i].h);
	}
	
	sort(stu, stu+n, cmp);
	
	int lastnum = n/k + n%k;
	Student temp[lastnum];
	int mid = lastnum/2 + 1;
	temp[mid] = stu[0];
	int t = 1;
	int flag = 0;
	for(int i=1; i<lastnum; i++){
    
    
		if(!flag){
    
    
			temp[mid-t] = stu[i];
			flag = 1;
		}else{
    
    
			temp[mid+t] = stu[i];
			t++;
			flag = 0;
		}
	}
	
	for(int i=1; i<=lastnum; i++){
    
    
		printf("%s", temp[i].name);
		if(i != lastnum) printf(" ");
	}
	printf("\n");
	
	int numleft = n - lastnum;
	Student nstu[numleft];
	for(int i=1; i<=numleft; i++){
    
    
		nstu[i] = stu[lastnum++];
	}
	
	int num = n / k;
	int lun = numleft / num;
	for(int i=0; i<lun; i++){
    
    
		Student temp[num+1];
		int mid = num/2 + 1;
		temp[mid] = nstu[i*num+1];
		int t = 1;
		int flag = 0;
		for(int j=i*num+2; j<=(i+1)*num; j++){
    
    
			if(!flag){
    
    
				temp[mid-t] = nstu[j];
				flag = 1;
			}else{
    
    
				temp[mid+t] = nstu[j];
				t++;
				flag = 0;
			}
		}
		for(int j=1; j<=num; j++){
    
    
			printf("%s", temp[j].name);
			if(j != num) printf(" ");
		}
		printf("\n");
	}
	
	return 0;
} 

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/113696612