当前位置: 代码迷 >> 综合 >> PAT 1055 集体照 (25 分)
  详细解决方案

PAT 1055 集体照 (25 分)

热度:101   发布时间:2023-11-24 12:09:01.0

题目链接<==戳这

这题要注意几个点:
1.我们应该从左往右交替站入

2.如何实现左右交替站入:把 i++ 改为 i+=2 即每次加2

3.利用vector的时候,如果要直接对其中的元素赋值,或者直接输入该元素,不能定义成类似于 vector < int > v ;
而应该是:vector < int > v (n+1) ;(n也可以);

4.用结构体储存每个人的身高和名字

5.从我们的角度看,最后一排应该是输出的第一行,即多余的全部输出在第一行

上代码理解:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{
    			//储存信息string name;		//名字int height;			//身高
};
bool cmp(node a,node b){
    	//排序原则if(a.height!=b.height) return a.height>b.height;else return a.name<b.name;
}
int main(){
    int n,k;cin>>n>>k;vector<node> v(n+1);	//储存每一个人的信息for(int i=0;i<n;i++){
    cin>>v[i].name>>v[i].height;}sort(v.begin(),v.end(),cmp); //从高到矮排序int per=n/k,last=n-n/k*(k-1);//per代表输出中: 2-k 行每行的人数,last代表输出中:第一行的人数int t=0,row=k,m;	// t 代表每一行的最高的人在 v 中的下标,初始化为0// row 为行数,初始化为 k// m 为临时变量储存当前行的人数while(row){
    if(row==k) m=last;else m=per;vector<string> ans(n+1);	//储存左右交替站入后的排列(结果)ans[m/2]=v[t].name;			//先给中间元素赋值int pos=m/2;				//pos代表当前正在站入ans[pos]这个位置for(int i=t+1;i<=t+m-1;i+=2){
    	//最高的人的左边ans[--pos]=v[i].name;}pos=m/2;for(int i=t+2;i<=t+m-1;i+=2){
    	//最高的人的右边ans[++pos]=v[i].name;}for(int i=0;i<m;i++){
    cout<<ans[i];if(i!=m-1) putchar(' ');else putchar('\n');}t+=m;			//更新 t 和 row 的值row--;}
} 
  相关解决方案