计蒜客题解-T1265补提交卡

该博客讨论了一道计蒜客评级普及T3级别的编程题目,涉及100天内未提交天数n和可用补提交卡m的情况。文章详细分析了三种不同情况的解题思路:m小于等于n、m等于0和m大于n,并提供了相应的代码实现。重点在于如何通过枚举算法找到最长连续不提交天数的最大值。

题目概况

链接: https://nanti.jisuanke.com/t/T1265
难度: 普及/提高-(计蒜客评级普及T3)

题目分析

简化题目: 100天内,有n天没提交,但有m张补提交卡可以用在m天上,用完它们,最长可以有多少天连续
涉及知识点: 枚举算法
解题思路:
我们可以通过枚举第一次用补提交卡的那一天,然后往后推m - 1次,计算其连续天数,再取最大值。但通过多次WA 思考,我们得知m可能为0m也可以多于未提交的n天数,所以逐情况考虑m的情况:
1. m <= n,按上述思路即可,但需要特别注意当枚举位置靠后时还往后推m可能越界越出n,需要做一下处理
2. m > n,那不用算了,所有未提交都给补上,最长100天
3. m == 0,在这种情况下,我们只能取第j个未提交天和第j-1个未提交天间的最长连续天

代码要点拆解

m <= n的情况

要点:
1.用mm记录m,用first记录i(第一次用补提交卡的那天)
2.用while循环往后推,两个判断:first不能超出nmm必须大于0
3.如果first超出了n,那么就直接用100减去当前第一个补提交天的前一个未提交天
4.没有特殊情况就直接用最后一次补提交天减去第一个补提交天再减1(这个自己可以举小例子推)

    for (int i = 1; i <= n; i++) {
            int mm = m, first = i; //记录
            while (first <= n && mm > 0) {
                first++;
                mm--;
            }
            if (first > n) {
                ans = max(ans, 100 - a[i - 1]);
            }
            ans = max(ans, (a[first] - a[i - 1] - 1));
        }

m == 0以及m > n的情况

要点:见解题思路。就有一个要注意,我们的j只循环到n,那么还需要样100减去a[n]

     if (m >= n) {
            ans = 100;
        }
     if (m == 0) {
         for (int j = 1; j <= n; j++) {
             ans = max(ans, (a[j] - a[j - 1] - 1));
         }
         ans = max(ans, 100 - a[n]);
     }

完整代码

#include <iostream>
#include <cstdio>
using namespace std;

const int MAXN = 105;
int T;
int n, m; //n天没提交,m张卡
int ans;
int a[MAXN];

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        
        for (int i = 1; i <= n; i++) {
            int mm = m, first = i;
            while (first <= n && mm > 0) {
                first++;
                mm--;
            }
            if (first > n) {
                ans = max(ans, 100 - a[i - 1]);
            }
            ans = max(ans, (a[first] - a[i - 1] - 1));
        }
        
        if (m >= n) {
            ans = 100;
        }
        if (m == 0) {
            for (int j = 1; j <= n; j++) {
                ans = max(ans, (a[j] - a[j - 1] - 1));
            }
            ans = max(ans, 100 - a[n]);
        }
        
        cout << ans << endl;
        ans = 0; //多组数据记得清空ans变量
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oier_Asad.Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值