题解:P12843 [蓝桥杯 2025 国 A] 生日相遇问题

· · 题解

洛谷P12843题解

题目传送门

思路

因为 k 很小,所以我们可以直接从 2025 年枚举至 2025+k-1 年,依次判断这一年是否满足两人的生日在同一个星期几。需要注意的是,闰年的处理方式比较特殊:当在平年且某人生日是 229 日时,将此人的生日算作在 228 日。

代码

#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;
}