首页 > 代码库 > 寝室扫地问题(swust oj 0509)

寝室扫地问题(swust oj 0509)

题目描述:http://acm.swust.edu.cn/problem/0509/ 

解题思路:主要是由于在写计算是否闰年的时候,想到了个巧妙地方法:

 

int is_leap(int x)//判断是否闰年{    return !(x%4&&x%400);}

 

以及对于

 

if(x>a)    sum=b+1;else   sum=b;

有了改进的方法:

 

sum=b+(x>a);

 

AC代码:

 

 1 #include<stdio.h> 2 struct date//记录日期 3 { 4     int year,day,month; 5 }; 6 int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//记录天数 7 int is_leap(int x)//判断是否闰年 8 { 9     return !(x%4&&x%400);10 }11 int a_year(int x)12 {13     if(x==2007)14         return (mon[9]+mon[10]+mon[11]+mon[12]);15     else16         return is_leap(x)+365;17 }18 int minus(struct date x)19 {20     int i,ans=0;21     if(x.year==2007){22         for(i=9;i<x.month;i++)23             ans+=mon[i];24         ans+=x.day;25         return ans;26     }27     for(i=2007;i<x.year;i++)28         ans+=a_year(i);29     if(x.month==1)30         ans+=x.day;31     else if(x.month==2)32         ans+=(x.day+mon[1]);33     else34     {35         for(i=1;i<x.month;i++)36             ans+=mon[i];37         ans+=(is_leap(x.year)+x.day);38     }39     return ans;40 }41 int main()42 {43     struct date quiz;44     while(scanf("%d%d%d",&quiz.year,&quiz.month,&quiz.day)!=EOF){45         int days=minus(quiz);46         int a=days%7;47         if(a==3)48             printf("ALL\n");49         else50         {51             int week=days-(days/7)-(a>3);52             week=week%4;53             if(week==1)54                 printf("B\n");55             else if(week==2)56                 printf("X\n");57             else if(week==3)58                 printf("H\n");59             else60                 printf("P\n");61         }62     }63     return 0;64 }

 

寝室扫地问题(swust oj 0509)