题解:P12843 [蓝桥杯 2025 国 A] 生日相遇问题
洛谷P12843题解
题目传送门
思路
因为
代码
#include<bits/stdc++.h>
using namespace std;
int k,d1,n,d2,m;
bool f=0;
int months[]={31,28,31,30,31,30,31,31,30,31,30,31};//预处理每个月份的天数
bool r(int i)//判断闰年
{
if(i%4==0)
{
if(i%100==0)
{
if(i%400==0)
{
return true;
}
}
else
{
return true;
}
}
return false;
}
int day_x(int x,int y,int i)
{
int day=0;
if(r(i))
{
months[1]=29;//如果是闰年的话就把2月的天数改为29天
}
else
{
months[1]=28;//注意,如果不是闰年,一定要把天数改回来
}
if(months[1]!=29&&x==2&&y==29)
{
y=28;//如果某人的生日是2月29日,那么在非闰年中,他/她的生日将被视为2月28日进行计算。
}
for(int j=0;j<x-1;j++)
{
day+=months[j];//累加天数
}
day+=y;//加上剩余的
return day;
}
int main()
{
cin>>m>>d1>>n>>d2>>k;
int xq=3;//2025年1月1日是星期三
for(int i=2025;i<=2025+k-1;i++)
{
int day_m=day_x(m,d1,i),day_n=day_x(n,d2,i);
if((day_n+xq-1)%7==(day_m+xq-1)%7)//满足条件,输出
{
cout<<i<<endl;
f=1;
}
if(r(i))
{
xq=(xq+366)%7;//算出是今年是闰年的情况下,下一年是星期几
}
else
{
xq=(xq+365)%7;//算出是今年是平年的情况下,下一年是星期几
}
}
if(!f)
{
cout<<"No Answer";
}
return 0;
}