PAT:1028. 人口普查(20) AC

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct STU
{
  char mname[10];
  int y,m,d;
}tmp,old,young,left,right;
 
void init()
{
  old.y=right.y=2014;
  young.y=left.y=1814;
  old.m=right.m=young.m=left.m=9;
  old.d=right.d=young.d=left.d=6;
}

bool isless2014(STU a,STU b)      //判断是否超过2014,9,6  判断a是不是小于b
{
  if(a.y!=b.y)
    return a.y<=b.y;
  else
    if(a.m!=b.m)
      return a.m<=b.m;
    else
      return a.d<=b.d;
}

bool ismore1814(STU a, STU b)      //判断是否不到1814,9,6   判断a有没有超过b
{
  if(a.y!=b.y)
    return a.y>=b.y;
  else
    if(a.m!=b.m)
      return a.m>=b.m;
    else
      return a.d>=b.d;
}

int main()
{
  init();
  int n;
  scanf("%d",&n);
  int num=0;
  for(int i=0 ; i<n ; ++i)                //输入一个,判断一个。不需要存储后排序
  {
    scanf("%s %d/%d/%d",&tmp.mname,&tmp.y,&tmp.m,&tmp.d);
  
    if(isless2014(tmp,right) && ismore1814(tmp,left))        //判断合法性
    {
      ++num;
      if(isless2014(tmp,old))              //tmp比old更早,更新old
        old=tmp;
      if(ismore1814(tmp,young))            //tmp比young更晚,更新young
        young=tmp;
    }
  }
  if(num==0)          //【warning】可能全部都不合法,输出0
    printf("0");
  else
    printf("%d %s %s",num,old.mname,young.mname);
  system("pause");
  return 0;
}


/*失败的方式,判断边界十分复杂

bool cmp(STU a,STU b)        //【skill】使用sort函数自己构造比较
{
  if(a.y!=b.y)          //按年月日大小排序
    return a.y>b.y;
  else
    if(a.m!=b.m)
      return a.m>b.m;
    else
      return a.d>b.d;
}
STU arr[100050];
int main()
{

  memset(arr,0,sizeof(arr));
  int n;
  scanf("%d",&n);
  for(int i=0 ; i<n ; ++i)
  {
    scanf("%s %d/%d/%d",&arr[i].mname,&arr[i].y,&arr[i].m,&arr[i].d);
  }
  sort(arr,arr+n,cmp);
  STU old,young;
  int tag=0,sum=0,last=-1;
  for(int i=0 ; i<n ; ++i)      //找最老
  {
    if(arr[i].y<1814)
    else 
    {
      if(arr[i].m>=9)
      
        if(arr[i].d>=6)
          if(arr[i].y<=2014)
            if(arr[i].m<=9)
              if(arr[i].d<=6)
              {
                if(0==tag)
                {
                  strcpy(old.mname,arr[i].mname);    //其实这里是young
                  tag=1;
                }
              ++sum;
              last=i;
              }
  }
  printf("%d %s %s",sum,old.mname,arr[last].mname);

*/
posted on 2015-02-18 15:14  Evence  阅读(1585)  评论(0编辑  收藏  举报