B4044 [语言月赛 202410] 奇迹战神

Igallta

2024-11-19 15:41:10

Solution

题意

一共有 n 个课程,对于每个课程,给出 wd,第 x 周的时候,如果满足 (d-1)\div x 的余数是 0(d-1) \mod x = 0)那这一周的星期 w 就要上这门课。

而且:当前这一天是第一周星期六

问你,距离这一天最近的课还有多久上课。

思路

首先,我们要输入。

cin>>n;
for(int i=1;i<=n;i++){
    cin>>x>>y;
//  .....
}

然后,我们思考:其实这道题就是算出每一节课距离当天的时间再取里面的最小值就可以了!

于是,我们使用一个变量 ans 来记录最小值,记录最小值,那么初始值就要是一个极大的值,这样才能去记录最小值,否则初始值就会变成最小值。

我们在信息学竞赛中一般使用 0x3f3f3f3f、0x7f7f7f7f、INT_MAX、1e9 等作为极大值。

int ans=0x3f3f3f3f;

现在,我们定义 k 是距离这一天的天数,我们来思考一下。

首先,题目说间隔 d 周,但是,最后一周不是一个整的周。(最后一周的间隔天数并非 7 天,因为那一周在周中开课了)

所以我们在处理间隔 d 周时 k 应该加 7(d-1) 而不是 7d

再处理星期 w 开课。你要知道,m 个数的间隔数是 m-1。所以,我们先 +1 让它变为星期天,然后直接加 w,因为星期天到任意一个星期 p 都是直接加 p。(你也可以理解为间隔数都是 p

所以,我们便可以计算出 k

int k=x+1+(y-1)*7;

然后再一直计算最小值,这部分的代码:

for(int i=1;i<=n;i++){
    cin>>x>>y;
    int k=x+1+(y-1)*7;
    if(ans>k){//如果最小值大了
        ans=k;
    }
}

最后记得输出!

cout<<ans;

总结

本题考查同学们的日期日历计算能力和最小值最大值的编码能力。本题是一道较好的最小值训练题,希望各位以后能熟练掌握日期日历间隔的计算和最小值的计算,不要弄错初始值!