题目描述
我们大多数人都有一个日历,我们可以在这个日历上涂写我们生活中重要事件的细节 - 拜访牙医,丽晶酒店24小时预订销售,编程比赛等等。不过也有固定的日期:合作伙伴的生日,结婚纪念日等; 我们也需要跟踪这些。通常我们需要提醒这些重要日期何时到来 - 事件越重要,我们越想提前进一步慢跑。
编写一个程序来提供这样的服务。输入将指定日历相关的年份(范围从1901到1999)。请记住,在指定的范围内,所有可以被4整除的年份都是闰年,因此会增加额外的一天(2月29日)。输出将指定“今天”的日期,即将发生的事件列表以及其相对重要性的指示。
输入
第一行输入将包含一个表示年份的整数(范围在1901到1999之间)。接下来是一系列代表周年纪念日或请求服务的日子。
周年纪念系列将包括字母'A'; 表示日期,月份和事件重要性的三个整数(D, M, P); 和一个描述事件的字符串,全部由一个或多个空格分隔。P将是介于1和7之间的数字(包括两者),并且表示在提醒服务应该开始的事件之前的天数。描述事件的字符串将始终存在,并将从优先级后的第一个非空字符开始。
日期行由字母'D'和上述日期和月份组成。
所有的周年纪念行将在任何日期行之前。没有一行会超过255个字符。该文件将由一个由单个#组成的行终止。
输出
输出将由一系列线组成,输入中的每个日期线都会有一行。每个区块将包含要求的日期,之后是当天的活动列表,以及随后的日子。
输出应指定事件的日期(D 和 M),在宽度为3的字段中右对齐,并指出事件的相对重要性。今天发生的事件应该标记如下,明天发生的事件应该有P星,后天发生的事件应该有P-1星,等等。如果几个事件安排在同一天,按相对重要性(星号)排序。
如果仍然存在冲突,请在输入流中对其进行排序。按照下面例子中使用的格式。在块之间留出1个空行。
样例输入
1993
A 23 12 5 Partner's birthday
A 25 12 7 Christmas
A 20 12 1 Unspecified Anniversary
D 20 12
#
样例输出
Today is: 20 12
20 12 *TODAY* Unspecified Anniversary
23 12 *** Partner's birthday
25 12 *** Christmas
算法实现:
#include<iostream>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
int sum1;
struct node
{
int m;
int d;
int p;
int id;
int sum;
char a[260];
}day;
bool cmp(const struct node& left,const struct node& right)
{
// return left.sum==right.sum?left.p>right.p:left.sum<right.sum;
if(left.sum==right.sum)//如果纪念日是同一天 按照星级排序大到小,如果星级一样,按照输入次序排序先来后到
{
if(left.sum==sum1) //如果纪念日是今天,按照输入次序先来后到
return left.id<right.id;
if(left.p==right.p)
return left.id<right.id;
else
return left.p>right.p;
}
else
return left.sum<right.sum;//纪念日不是同一天则按照日期小的在前面大的在后面排序
}
int main()
{
int time[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
vector <struct node> days;
int mark=0;
int year;
int m1,d1,i1=0;
cin>>year;
if(year%4==0)
time[2]=29;
for(int k=1;k<=12;k++)
time[k]+=time[k-1];
int i=0;
char ch;
int flag=0;
while(1)
{
cin>>ch;
if(ch=='#')
break;
if(ch=='A')
{
cin>>day.d>>day.m>>day.p;
gets(day.a);
while(day.a[0]==' ')
for(int k=0;day.a[k];k++)
day.a[k]=day.a[k+1];
day.sum=time[day.m-1]+day.d;//day.sum用来计算当天是当年的第几天
if(day.m==1)//如果该纪念日是一月标记为mark=1,总天数sum加上12月份的天数
{
day.sum+=time[12];
mark=1;
}
day.id=i;//记录是第几位输入的数据
days.push_back(day);//将该纪念日放入容器内
if(mark==1)//如果被标记为1,将该day放入容器,只是此时sum是正常的
{
day.sum-=time[12];
mark=0;
days.push_back(day);
i1++;
}
i++;//i用来统计有多少个纪念日
}
if(ch=='D')
{
cin>>d1>>m1;
sum1=time[m1-1]+d1;//sum1表示今天是今年的第几天
sort(days.begin(),days.end(),cmp);//将所有纪念日进行排序
flag=1;
printf("Today is:%3d%3d\n",d1,m1);
for(int j=0;j<i+i1;j++)
{
if(sum1>days[j].sum)//如果纪念日在今天之前 跳过
continue;
if(sum1==days[j].sum)//纪念日等于今天
printf("%3d%3d *TODAY* %s\n",days[j].d,days[j].m,days[j].a);
else //纪念日不等于今天
{
int k=days[j].p-(days[j].sum-sum1)+1;//k用来计算星级程度
int k1=7-k;//k1来计算空格数 保证输出整齐
if(k<=0)//如果星级程度为负 则跳过
continue;
printf("%3d%3d ",days[j].d,days[j].m);
while(k--)
cout<<"*";
while(k1--)
cout<<" ";
cout<<" "<<days[j].a<<endl;
}
}
cout<<endl;
}
}
return 0;
}