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

PAT 1055.集体照

热度:102   发布时间:2023-11-17 23:11:34.0

看的网上的思路


首先结构体的sort排序

int cmp(struct People a,struct People b)
{return a.height != b.height ? a.height> b.height : a.name < b.name;
}

按身高从高到低排,按名字从小到大排


sort实现原理

原始的cmp是

return a<b;
当a<b时返回真,按从小到大排。

可以自己修改cmp,真的返回什么就怎么排序


这题用了vector容器

vector使用方法

vector<something> p(n);
something换成自己需要的类型


思路:

一排一排的

最后一排站了多的人,计算最后一排的人数

int row = k;
if(row == k)
{m = n - n/k*(k-1);
}
row--;

当row!=k时

else
{m = n/k;
}


后面站位先找到中心点

vector<string> stemp(m);
stemp[m/2] = p[t].name;

然后从中往左边排,要左右顺序排,所以中间隔两个

int j = m/2-1;
for(i = t+1;i<t+m;i=i+2)
{stemp[j--] = p[i].name;
}


然后从中往右排

j = m/2+1;
for(i=t+2;i<t+m;i=i+2)
{
 stemp[j++] = p[i].name;
} 

最后打印啦



完整code:

#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;struct People
{string name;int height;
};int cmp(struct People a,struct People b)
{return a.height != b.height ? a.height> b.height : a.name < b.name;
}int main()
{int n,i,k;cin >> n >> k;vector<People> p(n);for(i=0;i<n;i++){cin >> p[i].name;cin >> p[i].height;}sort(p.begin(),p.end(),cmp);//从高到矮排 //	cout << p[0].name;int t=0,row = k,m;while(row){//cout << row << " ";if(row == k){m = n - n/k*(k-1);}else{m = n/k;}//cout << m << endl;vector<string> stemp(m);stemp[m/2] = p[t].name;//左边int j = m/2-1;for(i = t+1;i<t+m;i=i+2){stemp[j--] = p[i].name;}//右边j = m/2+1;for(i=t+2;i<t+m;i=i+2){stemp[j++] = p[i].name;} cout << stemp[0];for(i=1;i<m;i++){cout << " " << stemp[i];}cout << endl;t = t+m;row--;}return 0;
} 


  相关解决方案