近几天ac不了,都是细节方面出了问题,这次因为对自定义排序理解不到位造成的。
bool cmp(const node&a, const node&b)
{
bool ct=false;
if (a.len>b.len)ct = true;
else if (a.len == b.len)
{
if (strcmp(b.name,a.name)==1)ct = true;
}
return ct;
}
bool cmp(const node&a, const node&b)
{
if (a.len != b.len){
return a.len > b.len;
}
else{
return a.name < b.name;
}
}
1055 集体照 (25)(25 分)
拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:
- 每排人数为N/K(向下取整),多出来的人全部站在最后一排;
- 后排所有人的个子都不比前排任何人矮;
- 每排中最高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);
- 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);
- 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。
现给定一组拍照人,请编写程序输出他们的队形。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出两个正整数N(<=10000,总人数)和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
代码(三个测试点没过):
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
struct node{
char name[100];
int len;
};
bool cmp(const node&a, const node&b)
{
bool ct=false;
if (a.len>b.len)ct = true;
else if (a.len == b.len)
{
if (strcmp(b.name,a.name)==1)ct = true;
}
return ct;
}
vector<node>h(10100);
int main(){
int N, k; //N个人,k排
int gi[100];
cin >> N >> k;
int per = N / k; //
int last = N - (k - 1)*per;
for (int i = 0; i<k; i++)
{
if (i == k - 1)gi[i] = last;
else gi[i] = per;
// cout << gi[i] << " ";
}
//cout << endl; //
vector<vector<node> > b(k, vector<node>(last));
for (int i = 0; i<N; i++)
{
node kk;
cin >> kk.name >> kk.len;
h.push_back(kk);
}
sort(h.begin(), h.end(), cmp);
//for (int i = 0; i<N; i++)
//cout <<h[i].name<<" "<< h[i].len << " "; //
//cout << endl;
int pe = N; int hg = k; int g = 0; int p = 1;
for (int hg = k - 1; hg >= 0&&g<pe; hg--)
{
p = 1;
for (int i = gi[hg] / 2, j = gi[hg] / 2; i <= gi[hg] - 1 && j >= 0&&g<pe;)
{
if (p % 2 == 1&&j>=0){
b[hg][i] = h[g++];
j--;
}
else if (p % 2 == 0&&i<=gi[hg]-1){
b[hg][j] = h[g++];
i++;
}
p++;
}
}
//cout << "最后一步!"<<endl;
for (int i = k - 1; i >= 0; i--)
{
for (int j = 0; j<gi[i]; j++)
{
cout<<b[i][j].name;
if (j != gi[i] - 1)cout << " ";
}if(i!=0)cout << endl;
}
}
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
struct node{
string name;
int len;
};
bool cmp(const node&a, const node&b)
{
if (a.len != b.len){
return a.len > b.len;
}
else{
return a.name < b.name;
}
}
vector<node>h(10100);
int main(){
int N, k; //N个人,k排
int gi[100];
cin >> N >> k;
int per = N / k; //
int last = N - (k - 1)*per;
for (int i = 0; i<k; i++)
{
if (i == k - 1)gi[i] = last;
else gi[i] = per;
// cout << gi[i] << " ";
}
//cout << endl; //
vector<vector<node> > b(k, vector<node>(last));
for (int i = 0; i<N; i++)
{
node kk;
cin >> kk.name >> kk.len;
h.push_back(kk);
}
sort(h.begin(), h.end(), cmp);
//for (int i = 0; i<N; i++)
//cout <<h[i].name<<" "<< h[i].len << " "; //
//cout << endl;
int pe = N; int hg = k; int g = 0; int p = 1;
for (int hg = k - 1; hg >= 0 && g<pe; hg--)
{
p = 1;
for (int i = gi[hg] / 2, j = gi[hg] / 2; i <= gi[hg] - 1 && j >= 0;)
{
if (p % 2 == 1 && j >= 0){
b[hg][i] = h[g++];
j--;
}
else if (p % 2 == 0 && i <= gi[hg] - 1){
b[hg][j] = h[g++];
i++;
}
p++;
}
}
//cout << "最后一步!"<<endl;
for (int i = k - 1; i >= 0; i--)
{
for (int j = 0; j<gi[i]; j++)
{
cout << b[i][j].name;
if (j != gi[i] - 1)cout << " ";
}if(i!=0)cout << endl;
}
}