题解 CF304B 【Calendar】

Fractures

2018-10-13 07:21:16

Solution

# 啊啊啊啊!为什么黑题掉紫了?我本来想水一道黑题啊! ……不过即便如此,这还是我第一次写紫题题解欸,鸡冻~ 其实这道题~~很简单~~,思路就是把中间的几年算出来,再把第一年到第二年算出来,再就把第二年算出来就行了 ```cpp #include<cstdio> #include<iomanip> using namespace std; int year1,month1,day1; int year2,month2,day2; int date; int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool runnian(int n){//判断闰年 bool flag=false; if((n%4==0&&n%100!=0)||n%400==0)flag=true; return flag; } int main(){ scanf("%d:%d:%d",&year1,&month1,&day1); scanf("%d:%d:%d",&year2,&month2,&day2); if(year1>year2||(year1==year2&&month1>month2)||(year1==year2&&month1==month2&&day1>day2)){//保持year2比year1大 swap(year1,year2); swap(day1,day2); swap(month1,month2); } for(int i=year1+1;i<year2;i++){//算出中间的几年 date=date+365; if(runnian(i)==true){//多加一天 date++; } } for(int i=1;i<=month2;i++){//算出year2有几天 for(int j=1;j<=months[i];j++){ date++; if(runnian(year2)==true){ if(i==2&&j==28)date++; } if(i==month2&&j==day2)break; } } for(int i=month1;i<=12;i++){//算出year1有几天 for(int j=1;j<=months[i];j++){ date++; if(runnian(year1)==true){ if(i==2&&j==28)date++; } } } date=date-day1; if(year1==year2){//特判 date=date-365; if(runnian(year1)==true)date--; } if(year1==year2&&month1==month2&&day1==day2)date=0;//暴力特判(本人很懒) printf("%d",date); return 0; } ```