题目大意:
制作一个日历系统,输入年份,一些周年纪念日,及服务要求日期,根据要求日期输出,输出重要程度小于发生日期的周年纪念日。
题目地址:
UVA 145
个人见解:
纯模拟,在闰年,输出顺序及输出范围可能跨年上有坑。解决了这些后,依旧困了我十多天,一直没过,求指导。
我的程序里先读入周年纪念日,l代表周年纪念日的数量,每读入一个服务日期,调用f()函数,f()函数里先计算每日期相对于当年月号的日期,然后Is()函数判断是否要输出并将要输出移至数组前方,k代表要输出的周年纪念日的数量,最后按日期,重要程度,输入先后排序,输出。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int d[1000],m[1000],n[1000],p[1000],q[1000]; int y,i,j,k,l; char s[1000][255]; int Is(int i,int j) { int x,z; if (n[i]>=n[0]) x=n[i]-n[0]; else x=n[i]+365+y-n[0]; if (n[j]>=n[0]) z=n[j]-n[0]; else z=n[j]+365+y-n[0]; if (x>z) return 1; else if (x==z&&p[i]<p[j]) return 1; else if (x==z&&p[i]==p[j]&&q[i]>q[j]) return 1; else return 0; } int swap(int i,int j) { int t; char c[255]; t=d[i]; d[i]=d[j]; d[j]=t; t=m[i]; m[i]=m[j]; m[j]=t; t=n[i]; n[i]=n[j]; n[j]=t; t=p[i]; p[i]=p[j]; p[j]=t; t=q[i]; q[i]=q[j]; q[j]=t; strcpy(c,s[i]); strcpy(s[i],s[j]); strcpy(s[j],c); return 0; } int f() { for (i=0;i<l;i++) { if (m[i]==1) n[i]=d[i]; if (m[i]==2) n[i]=31+d[i]; if (m[i]==3) n[i]=59+d[i]; if (m[i]==4) n[i]=90+d[i]; if (m[i]==5) n[i]=120+d[i]; if (m[i]==6) n[i]=151+d[i]; if (m[i]==7) n[i]=181+d[i]; if (m[i]==8) n[i]=212+d[i]; if (m[i]==9) n[i]=243+d[i]; if (m[i]==10) n[i]=273+d[i]; if (m[i]==11) n[i]=304+d[i]; if (m[i]==12) n[i]=334+d[i]; if (y&&m[i]>2) n[i]++; } k=1; for (i=1;i<l;i++) if ((n[i]>=n[0]&&n[i]-n[0]<=p[i])||(n[i]+365+y>=n[0]&&n[i]+365+y-n[0]<=p[i])) { swap(k,i); k++; } for (i=1;i<k;i++) for (j=i;j<k;j++) if (Is(i,j)) swap(i,j); printf("Today is:%3d%3d\n",d[0],m[0]); for (i=1;i<k;i++) { printf("%3d%3d ",d[i],m[i]); if (n[i]==n[0]) printf("*TODAY*"); else { if (n[i]>n[0]) { for (j=0;j<p[i]+n[0]-n[i]+1;j++) printf("*"); for (j=0;j<7-(p[i]+n[0]-n[i]+1);j++) printf(" "); } else { for (j=0;j<p[i]+n[0]-n[i]-365-y+1;j++) printf("*"); for (j=0;j<7-(p[i]+n[0]-n[i]-365-y+1);j++) printf(" "); } } printf(" %s\n",s[i]); } return 0; } int main() { char ch; scanf("%d\n",&y); if (y%4==0) y=1; else y=0; l=1; while (scanf("%c",&ch)&& ch!='#') { if (ch=='A') {scanf("%d%d%d \n",&d[l],&m[l],&p[l]);gets(s[l]);q[l]=l;l++;} if (ch=='D') {scanf("%d%d\n",&d[0],&m[0]);f();} } return 0; }
时间: 2024-11-03 20:59:34