P8780 [蓝桥杯 2022 省 B] 刷题统计

· · 题解

A. 前言

本蒟蒻的第一篇题解。

B. 题意分析

本题可采用暴力法枚举法。

原题再现: 小明计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?

小明每天会刷多少题,我们已经知道了,那我们就可以枚举从“下个星期一”到他完成 flag 那天他刷的题数,将这个数量加入一个变量(代码中叫 sum)中,将其与 n 比较。

C. \textcolor{green}{AC} \textcolor{green}{Coding}

读入数据的语句轻轻松松写出来——

    long long a,b,n,sum = 0,cnt;
    ios::sync_with_stdio(false); //快读,用了以后就不能用scanf和printf了
    cin >> a >> b >> n;

请注意,对于 100\% 的评测用例,\textcolor{red}{1 \leq a, b, n \leq 10^{18}}!

接下来就是枚举。

    for(cnt = 1;sum <= n;cnt++) //枚举每一天
    {
        if(cnt % 7 <= 5 && cnt % 7 >= 1) //如果是周一到周五
            sum += a; //刷a道题
        else //周六周日
            sum += b; //刷b道题
    }

最后输出莫忘记!

    cout << cnt;

可能有人会问,为什么要把计数变量的值输出前要 -1 呢? 如果你仔细学了循环,你会发现《深基》里有一段话是这么说的:

for (循环变量初始值; 循环条件; 循环结束操作) 
{
    循环体执行语句;
}

如果符合循环条件,则进入循环。对于每次循环,运行循环体, 然后进行每轮循环结束的操作。

意思是说:

(1)让循环变量获得一个初始值;

(2)判断是否满足循环条件;

(3)执行一次语句;

(4)进行循环结束操作;

(5)回到第二条。

所以,我们的 cnt 变量最后要 -1。

D. 完整程序(我知道有些人只看这里)

//P8780 [蓝桥杯 2022 省 B] 刷题统计 
#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long a,b,n,sum = 0,cnt;
    ios::sync_with_stdio(false); //快读,用了以后就不能用scanf和printf了
    cin >> a >> b >> n;
    for(cnt = 1;sum <= n;cnt++)
    {
        if(cnt%7<=5&&cnt%7>=1)
            sum += a;
        else
            sum += b;
    }
    cnt--;
    cout << cnt;
    return 0;
}

结束!