pku 1209 Calendar 历法问题,超多trick

简要题意:
给出1900-1999 年中任一一年的事件,(d.m.p),分别表示日、月、重要度(提前p天需要通知)。然后给出n个时间点,要求输出需要提醒的日期。排序规则很诡异(与官 方测试数据不同),引poj的discuss:先是按时间排,时间相同就看是不是今天,是今天就只管输入顺序,不是今天就先考虑星星的问题再来输入顺序。

我的解法:
将事件看做区间,开一个366的二维数组或者vector,来记录覆盖每个时间点的事件。然后对每个数组按照上述排序规则进行排序。
输出的时候有点诡异,所有的时间输出采取右对齐并占3字节。
还有个更诡异的,时期会套圈。。。(感觉和题意描述有点区别),就是说,如果输出12.31号需要提醒的事件,那么需要考虑1月份的,然后排序的时候1月份还要排在后面。。。。

代码:
  1 Source Code
  2 Problem: 1209        User: yzhw
  3 Memory: 616K        Time: 0MS
  4 Language: G++        Result: Accepted
  5 
  6     * Source Code
  7 
  8       # include <cstdio>
  9       # include <vector>
 10       # include <cstring>
 11       # include <string>
 12       # include <algorithm>
 13       using namespace std;
 14       struct node
 15       {
 16           int t,r,id,d,m;
 17           char name[255];
 18           bool operator<(const node &pos) const
 19           {
 20               if(t!=pos.t) return t<pos.t;
 21               else if(r!=pos.r) return r>pos.r;
 22               else return id<pos.id;
 23           }
 24       };
 25       vector<node> day[400];
 26 
 27       int main() {
 28       //    freopen("c.in","r",stdin);
 29       //    freopen("ans.txt","w",stdout);
 30           int year,c=0;
 31           scanf("%d",&year);
 32           int time[13];
 33           time[0]=0;
 34           for(int i=1;i<=12;i++)
 35               if(i<=7&&i%2||i>7&&!(i%2))
 36                   time[i]=31;
 37               else
 38                   time[i]=30;
 39           if(year%4==0)
 40               time[2]=29;
 41           else
 42               time[2]=28;
 43           for(int i=2;i<=12;i++)
 44               time[i]+=time[i-1];
 45           bool flag=false;
 46           while(true)
 47           {
 48               char jud[5];
 49               scanf("%s",jud);
 50               if(jud[0]=='#'break;
 51               else if(jud[0]=='A')
 52               {
 53                   int d,m,l;
 54                   scanf("%d%d%d",&d,&m,&l);
 55                   char str[300];
 56                   gets(str);
 57                   while(str[0]==' ')
 58                       for(int i=0;i<strlen(str);i++)
 59                           str[i]=str[i+1];
 60                   for(int i=max(1,time[m-1]+d-l);i<=time[m-1]+d;i++)
 61                   {
 62                       node tmp;
 63                       strcpy(tmp.name,str);
 64                       tmp.id=c;
 65                       tmp.d=d;
 66                       tmp.m=m;
 67                       if(i!=time[m-1]+d)
 68                          tmp.r=l-(time[m-1]+d-i-1);
 69                       else
 70                          tmp.r=8;
 71                       tmp.t=time[m-1]+d;
 72                       day[i].push_back(tmp);
 73                   }
 74 
 75                   for(int i=time[12]+time[m-1]+d-l;i<=time[12];i++)
 76                   {
 77                       node tmp;
 78                       strcpy(tmp.name,str);
 79                       tmp.id=c;
 80                       tmp.d=d;
 81                       tmp.m=m;
 82                       tmp.r=l-(time[m-1]+d-1+time[12]-i+1-1);
 83                       tmp.t=time[m-1]+d+time[12];
 84                       day[i].push_back(tmp);
 85                   }
 86                   c++;
 87               }
 88               else
 89               {
 90                   if(!flag)
 91                   {
 92                       flag=true;
 93                       for(int i=0;i<=time[12];i++)
 94                           sort(day[i].begin(),day[i].end());
 95                   }
 96                   int d,m;
 97                   scanf("%d%d",&d,&m);
 98                   printf("Today is:%3d%3d\n",d,m);
 99                   for(int i=0;i<day[time[m-1]+d].size();i++)
100                   {
101                      printf("%3d%3d ",day[time[m-1]+d][i].d,day[time[m-1]+d][i].m);
102                      if(day[time[m-1]+d][i].t==time[m-1]+d) printf("*TODAY*");
103                      else
104                      {
105                        for(int j=0;j<day[time[m-1]+d][i].r;j++)
106                            printf("*");
107                        for(int j=day[time[m-1]+d][i].r+1;j<8;j++)
108                            printf(" ");
109                      }
110                      printf(" %s\n",day[time[m-1]+d][i].name);
111                   }
112                   printf("\n");
113               }
114           }
115           return 0;
116       }
117 
118 

posted on 2010-11-26 20:38 yzhw 阅读(216) 评论(0)  编辑 收藏 引用 所属分类: data struct


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜