1055 集体照 (25分)

#include
#include
#include
#include
using namespace std;
struct people
{
    char name[12];
    int tall;
    int site;
}p[10100];
bool cmp(people p1, people p2)
{
    if (p1.tall != p2.tall)
        return p1.tall > p2.tall;
    else if (strcmp(p1.name, p2.name) < 0)
        return 1;
    else return 0;
}
bool cmp2(people p1, people p2)
{
    return p1.site < p2.site;
}
int main()
{
    int per, clu;
    cin >> per;
    cin >> clu;
    for (int i = 0; i < per; i++)
        scanf("%s%d", p[i].name, &p[i].tall);
    sort(p, p + per, cmp);
    int pai = per / clu;
    int npai = per - (clu - 1) * pai;//最后一排人数
    int next, a = 0, b = 1;
    next = npai / 2;
    p[0].site = next;//最后一排中心位
    for (int j = 1; j <= npai - 1; j++)//先安置最后一排
    {
        a += 1;
        b *= (-1);
        next = next + a * b;
        p[j].site = next;
    }
    for (int i = 1; i < clu; i++)
    {
        a = 0, b = 1;
        next = npai + (i - 1) * pai - 1 + pai / 2+1;
        int j = npai + (i - 1) * pai;
        p[j++].site = next;
        for (; j <= npai + i * pai - 1; )//安置其他排
        {
            a += 1;
            b *= (-1);
            next = next + a * b;
            p[j++].site = next;
        }
    }
    sort(p, p + per, cmp2);
    for (int i = 0; i < npai; i++)
    {
        if (i)
            printf(" ");
        printf("%s", p[i].name);
    }
    printf("\n");
    for (int i = 1; i < clu; i++)
    {
        for (int j = npai + (i - 1) * pai; j < npai + i * pai; j++)
        {
            if (j != npai + (i - 1) * pai)
                printf(" ");
            printf("%s", p[j].name);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(1055 集体照 (25分))