PAT1055. The World's Richest

来源:互联网 发布:淘宝美工要学多久 编辑:程序博客网 时间:2024/04/30 04:22

自己写的代码有一个测试点超时,借鉴了以为仁兄的代码,在对结构体排序后,还要进行剪枝,去掉年龄出现100次以上的,编程真的是细节很重要,小菜我还要多多学习啊!

下面贴上AC代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct person{
    char name[10];
    int age;
    int net_worth;
}p[100001];
bool cmp(const person& a,const person& b)
{
       if(a.net_worth>b.net_worth)  return true;
       else if(a.net_worth==b.net_worth)
       {
               if(a.age<b.age)  return true;
               else if(a.age==b.age)
               {
                      int t=strcmp(a.name,b.name);
                      if(t<0)  return true;
                      else return false;
               }
               else return false;
       }
       else return false;
}

int main()
{
      int n,k,m,amin,amax;
      //freopen("E:\\个人程序\\机试练习\\pat练习\\input.txt","r",stdin);
      //freopen("E:\\个人程序\\机试练习\\pat练习\\output.txt","w",stdout);
      scanf("%d%d",&n,&k);
      for(int i=0;i<n;i++)
      {
             scanf("%s%d%d",p[i].name,&p[i].age,&p[i].net_worth);
      }
      int count=1;
      sort(p,p+n,cmp);
      int ageCount[201]={0};
      int filternum=0;
      int *filter=new int[n];
      for(int i=0;i<n;i++)
      {
             if(++ageCount[p[i].age]<101)
             {
                 filter[filternum++]=i;    
             }
      }
      while(count<=k)
      {
             printf("Case #%d:\n",count);
             scanf("%d%d%d",&m,&amin,&amax);
             int cnt=0;
             for(int i=0;i<filternum;i++)
             {
                    int index=filter[i];
                    if(p[index].age>=amin&&p[index].age<=amax)
                    {
                           printf("%s %d %d\n",p[index].name,p[index].age,p[index].net_worth);
                           cnt++;
                    }
                    if(cnt==m)  break;
             }
             if(cnt==0) printf("None\n");
             count++;
      }
      return 0;
}


0 0