蓝桥杯2022年第十三届省赛真题小问题求解

直接上图:

img

这是答案:

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    long  a,b,n;
    long day=0;
    cin>>a>>b>>n;
    day+=(n/(a*5+b*2))*7;
    n%=(a*5+b*2);
        long tmp=(n<=a*5?n%a==0?n/a:n/a+1:ceil((n-a*5)/b)+5);
        day=day+tmp;
    cout<<day<<endl;
    return 0;
}

“long tmp=(n<=a*5?n%a==0?n/a:n/a+1:ceil((n-a*5)/b)+5);
        day=day+tmp;”,这一段代码我改写为“day+=(n<=a*5?n%a==0?n/a:n/a+1:ceil((n-a*5)/b)+5);”,但结果就是不通过,有大佬能为我解答吗?鼠鼠我真的想不会了..........

【以下回答由 GPT 生成】

根据你的问题描述,你需要重新改写代码中的一段计算部分。具体来说,你需要修改原始代码中的 long tmp = (n<=a*5 ? (n%a==0 ? n/a : n/a+1) : ceil((n-a*5)/b)+5); 这一行代码。

经过仔细阅读和分析你的问题,我发现问题出在使用 ceil 函数上。ceil 函数是向上取整的函数,但在你的代码中使用了 ceil 函数来计算 (n-a*5)/b 的值,这是不正确的。

修改建议如下:

day += (n <= a*5 ? (n % a == 0 ? n / a : n / a + 1) : (n - a*5 + b*2 - 1) / (a*5 + b*2) * 7 + (n - a*5 + b*2) % (a*5 + b*2) <= a*5 ? 1 : 2);

修改后的代码使用了取余运算符 % 来计算 (n - a*5 + b*2) % (a*5 + b*2) 的值,并将结果与 a*5 进行比较,判断是否需要再加上 1

同时,由于你提到了使用 ceil 函数,我假设你在使用的是 C++ 或类似的编程语言。上面给出的代码是使用了三目运算符 ? : 来替代了原始代码中的 ceil 函数。如果你使用的是其他编程语言,可以相应地进行一些语法上的调整。

希望以上修改建议对你有所帮助。如果你还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

您的代码看起来像是为了计算一些特定条件下的日期。原来的代码中,你使用了一个复杂的三元运算符来计算“tmp”,然后将这个值加到“day”上。

您尝试将这段代码改写为“day+=(n<=a5?n%a==0?n/a:n/a+1:ceil((n-a5)/b)+5);”,但是结果没有通过。我认为问题可能在于运算符优先级。在C++中,三元运算符(?:)的优先级比二元运算符(+,-,*,/)高,但是比一元运算符(++,--,+,-)低。所以你的代码实际上是这样解析的:

day += (n <= a * 5 ? (n % a == 0 ? n / a : n / a + 1) : (ceil((n - a * 5) / b) + 5));

这与你原来的代码的含义是一致的。你的改写并没有改变原来的逻辑,所以理论上来说,结果应该是一样的。

然而,你说你的改写没有通过,所以我猜想可能的问题有:

  1. 可能是你的输入不满足你代码中的条件,所以你没有得到你期望的结果。你可以检查你的输入是否满足你的代码逻辑。
  2. 可能是存在其他的错误,这个错误和你的改写无关。因为在你提供的代码片段中,并没有看到其他的错误。

我建议你检查你的输入和代码的其他部分,以确定是否存在其他的问题。如果问题仍然存在,我建议你提供更多的信息,如错误消息或完整的代码,以便我们能更好地帮助你。

img


#include <iostream>
using namespace std;

int main() {
    long long a, b, n;
    cin >> a >> b >> n;
    
    long long day = 0;
    while (n > 0) {
        day++;
        if (day % 7 == 6 || day % 7 == 0) {
            n -= b;
        } else {
            n -= a;
        }
    }
    
    cout << day << endl;
    
    return 0;
}

引用 皆我百晓生 小程序回复内容作答:
你的修改代码将计算题目数量超过a5的部分的天数直接加到了day变量里,但实际上这部分题目可能会分布在多天中。原始代码中的逻辑是先计算整周的天数(day+=(n/(a5+b*2))*7),然后再计算剩余不足一周的题目数量的天数。所以你需要将这段代码改回来,即使用原来的逻辑:

long tmp=(n<=a*5?n%a==0?n/a:n/a+1:ceil((n-a*5)/b)+5);
day=day+tmp;

这样才能保证计算正确的天数。