1 条题解
-
0
1. 读取年份和处理闰年
- 读取年份
year
。 - 如果是闰年(
year % 4 == 0
),将2月的天数改为29天。 - 计算每个月的累计天数(
days_in_month
数组)。
2. 处理命令
- 循环读取命令,直到遇到
#
。 - 命令有两种:
A
(添加事件)和D
(显示事件)。
命令
A
(添加事件)- 读取
d
(日)、m
(月)、p
(提前提醒的天数)和事件名称str
。 - 处理事件名称前的多余空格。
- 将事件添加到两个时间段:
- 当前年份的提醒时间段:从
max(1, days_in_month[m-1] + d - p)
到days_in_month[m-1] + d
。- 对于非事件当天(
i != days_in_month[m-1] + d
),r
值为p - (days_in_month[m-1] + d - i - 1)
。 - 对于事件当天(
i == days_in_month[m-1] + d
),r
值为8(用于标记“TODAY”)。
- 对于非事件当天(
- 跨年提醒时间段:从
days_in_month[12] + days_in_month[m-1] + d - p
到days_in_month[12]
。r
值为p - (days_in_month[m-1] + d - 1 + days_in_month[12] - i)
。t
值为days_in_month[m-1] + d + days_in_month[12]
(即下一年的同一天)。
- 当前年份的提醒时间段:从
- 每次添加事件后,
k
(事件ID)递增。
命令
D
(显示事件)- 如果是第一次执行
D
命令(!flag
),对所有天数的事件进行排序。 - 读取
d
(日)和m
(月)。 - 输出“Today is: d m”。
- 遍历并输出
days_in_month[m-1] + d
这一天的事件:- 如果是事件当天(
t == days_in_month[m-1] + d
),输出“TODAY”。 - 否则,输出
r
个“*”和剩余空格(总共8个字符)。
- 如果是事件当天(
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #include<cmath> using namespace std; struct event{ int t,r,d,m; int id; char name[300]; bool operator<(const event &pos) const { if(t!=pos.t) return t<pos.t; else if(r!=pos.r) return r>pos.r; else return id<pos.id; } }; int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; vector<event> day[400];//每一天 int main() { int year,k=0; bool flag=false; scanf("%d",&year); if(year%4==0) days_in_month[2]=29;//是闰年 for(int i=2;i<=12;i++) days_in_month[i]+=days_in_month[i-1]; while(1) { char ch[5]; char str[300]; cin>>ch; if(ch[0]=='#') break; else if(ch[0]=='A') { int d,m,p; scanf("%d%d%d",&d,&m,&p); getchar(); // To consume the newline left by previous scanf cin.getline(str, 300); // Safer alternative to gets() while(str[0]==' ')//多余空格 for(int i=0;i<strlen(str);i++) str[i]=str[i+1]; for(int i=max(1,days_in_month[m-1]+d-p);i<=days_in_month[m-1]+d;i++) { event tmp; tmp.d=d;tmp.m=m; tmp.id=k; strcpy(tmp.name,str); if(i!=days_in_month[m-1]+d)//星号 tmp.r=p-(days_in_month[m-1]+d-i-1); else tmp.r=8; tmp.t=days_in_month[m-1]+d;// day[i].push_back(tmp); } for(int i=days_in_month[12]+days_in_month[m-1]+d-p;i<=days_in_month[12];i++) { event tmp; tmp.d=d;tmp.m=m; tmp.id=k; strcpy(tmp.name,str); tmp.r=p-(days_in_month[m-1]+d-1+days_in_month[12]-i); tmp.t=days_in_month[m-1]+d+days_in_month[12]; day[i].push_back(tmp); } k++; } else if(ch[0]=='D') { if(!flag) { flag=true; for(int i=0;i<=days_in_month[12];i++) sort(day[i].begin(),day[i].end()); } int d,m; scanf("%d%d",&d,&m); printf("Today is:%3d%3d\n",d,m); for(int i=0;i<day[days_in_month[m-1]+d].size();i++) { printf("%3d%3d ",day[days_in_month[m-1]+d][i].d,day[days_in_month[m-1]+d][i].m); if(day[days_in_month[m-1]+d][i].t==days_in_month[m-1]+d) printf("*TODAY*"); else { for(int j=0;j<day[days_in_month[m-1]+d][i].r;j++) printf("*"); for(int j=day[days_in_month[m-1]+d][i].r+1;j<8;j++) printf(" "); } printf(" %s\n",day[days_in_month[m-1]+d][i].name); } printf("\n"); } } return 0; }
- 读取年份
- 1
信息
- ID
- 210
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者