1 条题解

  • 0
    @ 2025-5-5 18:37:56

    1. 读取年份和处理闰年

    • 读取年份year
    • 如果是闰年(year % 4 == 0),将2月的天数改为29天。
    • 计算每个月的累计天数(days_in_month数组)。

    2. 处理命令

    • 循环读取命令,直到遇到#
    • 命令有两种:A(添加事件)和D(显示事件)。
    命令A(添加事件)
    • 读取d(日)、m(月)、p(提前提醒的天数)和事件名称str
    • 处理事件名称前的多余空格。
    • 将事件添加到两个时间段:
      1. 当前年份的提醒时间段:从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”)。
      2. 跨年提醒时间段:从days_in_month[12] + days_in_month[m-1] + d - pdays_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
    上传者