PAT——A1055(排序)

题目链接:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
struct person{
    char name[10];
    int age;
    int worth;
}pe[100010];

bool cmp(person a,person b)
{
    if(a.worth!=b.worth)
        return a.worth>b.worth;
    else if(a.age!=b.age)
        return a.age<b.age;
        else return strcmp(a.name,b.name)<0;
}
int main()
{
    int m,n;
    //int t,ma,mi;
    scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++)
    {
      scanf("%s %d %d",pe[i].name,&pe[i].age,&pe[i].worth);
    }
    sort(pe,pe+m,cmp);
    for(int i=0;i<n;i++)
    {
        int f=0;
        int t,ma,mi;
        scanf("%d %d %d",&t,&mi,&ma);
        printf("Case #%d:\n",i+1);
        for(int j=0;j<m&&t;j++)//需要预处理,不然会超时
        {
            if(pe[j].age>=mi&&pe[j].age<=ma)
            {
               printf("%s %d %d\n",pe[j].name,pe[j].age,pe[j].worth);
               t--;
               f=1;
            }
        }
         if(f==0)
           {
               printf("None\n");
           }

    }
    return 0;
}

另一种方法,也要预处理

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
int Age[maxn]={0};//某年龄的人数
struct person{
    char name[10];
    int age;
    int worth;
}pe[100010],pp[100010];

bool cmp(person a,person b)
{
    int s=strcmp(a.name,b.name);
    if(a.worth!=b.worth)
        return a.worth>b.worth;
    else if(a.age!=b.age)
        return a.age<b.age;
        return s<0;
}
int main()
{
    int m,n;
    int t,ma,mi;
    scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++)
    {
      scanf("%s %d %d",pe[i].name,&pe[i].age,&pe[i].worth);
    }
    sort(pe,pe+m,cmp);
    int validNum=0;//存放到valid数组中的人数
    for(int i=0;i<m;i++)
    {
        if(Age[pe[i].age]<100)
        {
            Age[pe[i].age]++;
            pp[validNum++]=pe[i];
        }
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d %d",&t,&mi,&ma);
        printf("Case #%d:\n",i);
        int k=0;
        for(int j=0;j<validNum&&k<t;j++)
        {
            if(pp[j].age>=mi&&pp[j].age<=ma)
            {
               printf("%s %d %d\n",pp[j].name,pp[j].age,pp[j].worth);
               k++;
            }
        }
         if(k==0)
           {
               printf("None\n");
           }

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42232118/article/details/81607508