简要题意:
给出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