PAT Basic1055(近几天ac不了,其实只有一步之遥)

近几天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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值