签到,补签,求最长连续签到多少天

本文介绍了一个关于连续签到优化的问题,通过合理分配有限的签到卡来最大化连续签到天数。输入包括测试组数、未签到天数及签到卡数量等,输出则是最优连续签到天数。

Contest - 河南省多校连萌(四)

Problem C: GJJ来签到

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 558   Solved: 117

Submit Web Board

Description

GJJ每天都很忙碌, 他每天要上班, 还要回家烧饭洗衣服。GJJ的公司有个要求, 每天上班需要打卡,忙碌的GJJ有时候会忘记打卡签到了,导致他的缺勤记录里有对应N天未签到的记录。 Gjj可是认识管理部门的妹子琳, 琳给了他M张签到卡,每张都可以消除某一天的未签到记录。将原本未签到的一天变成已经签到的一天。
GJJ现在想要利用这些签到卡使自己连续签到的天数最长, 小伙伴们请帮帮GJJ吧。

Input

第一行是一个正整数 T (T<=100),代表测试数据的组数。
每个测试数据第一行是两个整数N和M(0<=N, M<=100)。第二行包含N个整数a1到aN,表示GJJ没有打卡签到,输入保证a1,a2,a3...aN是严格递增的,并且任意一个ai, 1<=ai<=100。

Output

对于每组数据,输出使用签到卡后,最多能让GJJ连续签到天数变成多少。

Sample Input

2
8 2
3 4 19 26 33 53 62 90
5 2
27 29 49 50 70

Sample Output

56
51


#include<bits/stdc++.h> 
using namespace std;
const int N = 105;
int main()
{
    int t, n, m;
    int a[N];
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d %d", &n ,&m);
        a[0] = 0;
        for(int i = 1 ; i<=n; i++)
            scanf("%d", &a[i]);
        a[n+1] = 101;
        int Maxlen = 0;	//记录最长天数 
        if(m>=n)	//把缺的都补上,就是满勤 
            Maxlen = 100;
        else
        {
            for(int i = 0; i <= n - m ; i++)
            {
                if(a[i+m+1]-a[i]-1>Maxlen)
                    Maxlen = a[i+m+1] - a[i]-1;
            }
        }
        printf("%d\n", Maxlen);
    }
    return 0;
}


钉钉群签到补签功能通常由钉钉平台提供,普通用户无法直接修改其核心逻辑。然而,如果用户使用的是基于钉钉开放平台构建的第三方插件或自定义开发的补签插件,那么可以根据实际需补签功能进行定制化修改。 补签功能的核心逻辑通常涉及签到状态的判断、补签时间的限制以及签到据的存储与更新。例如,在一个基于 Redis 实现的签到系统中,补签功能会检查用户是否尝试补签未来的日期,并通过 Redis 的位图(bit)操作来更新用户的签到记录。此外,补签逻辑还涉及连续签到计算,确保补签操作不会破坏用户的连签状态[^1]。 如果需要修改钉钉群签到补签插件的行为,可以参考以下方式: 1. **限制补签时间**:在代码中加入对补签日期的判断,防止用户补签未来日期或超过允许补签的时间范围。例如,通过 `if ($day1 >= $day2)` 判断用户是否尝试补签未来日期,并返回错误提示。 2. **签到状态更新**:使用 Redis 的 `setbit` 方法更新用户的签到状态,确保补签操作能够正确记录到指定日期的签到状态中。 3. **连续签到计算**:在补签完成后,重新计算用户的连续签到。代码通过遍历当前日期与补签日期之间的签到状态,确保连续签到的准确性。 4. **UI 与交互逻辑**:在移动端(如 iOS)实现补签功能时,需要根据后台返回的签到状态来更新用户界面(UI),并提供补签操作入口。代码示例中提到的“复制代码时可能报错”提示开发者需要注意格式问题,如空格缺失可能导致语法错误[^2]。 5. **权限控制**:确保补签操作仅限于特定用户或管理员执行,避免普通用户随意修改签到记录。 ### 示例代码(PHP + Redis 实现补签逻辑) ```php public function buqian() { $uid = \request()->get('uid'); $day1 = \request()->get('day'); $mon = date('m'); $day2 = date('d'); if ($day1 >= $day2) { return "不能补签未来的签到"; } $int1 = intval($day1); $int2 = intval($day2); $key = 'user_'.$mon.'_'.$uid; $count = 1; if (Redis::getbit($key, $int1) == 1) { return '第'.$day1.'签到'; } else { Redis::setbit($key, $int1, 1); // 计算补签日到当前日的连续签到 for ($i = $int2 - 1; $i >= $int1; $i--) { if (Redis::getbit($key, $i) == 0) { echo "已连续签到".$count.''; return false; } else { $count++; } } // 计算补签日之前是否连续签到 for ($i = $int1 - 1; $i >= 0; $i--) { if (Redis::getbit($key, $i) == 0) { echo "已连续签到".$count.''; return false; } else { $count++; } } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值