[hihocoder1015]补提交卡

    xiaoxiao2021-12-14  27

    问题简介

    具体参照 hihocoder官网。

    实现思路

    最长连续提交天数等价于相邻未提交日期差值的最大值-1,所以原问题是求解去除哪些日期之后可以使得相邻日期的差值最大。 那么消除的日期必定是相邻的日期,否则可以通过改变某个不相邻日期为相邻日期使得差值增大。处理的时候前后加入虚拟日期第0日以及第101日,方便边界的处理。

    代码

    #include <iostream> using namespace std; int main() { int T; cin >> T; int n,m,nums[102]; nums[0] = 0; int result; for (int t = 0;t < T;++t){ cin >> n >> m; ++n; for (int i = 1;i < n;++i) cin >> nums[i]; nums[n] = 101; --n; if (m >= n) cout << 100 << endl; else { result = 0; for (int i = 0;i < n-m;++i){ if (result < nums[i+m+1]-nums[i]-1) result = nums[i+m+1]-nums[i]-1; } cout << result << endl; } } return 0; }

    后记:错误的思路

    想要减少枚举的次数,维护两端索引值,然后从中间包括n个日期到m个日期递减。(后来发现并没有丝毫的进步,都是n-m) 这里的递归默认的“有m个补提交卡去除的日期必定包含在有m+1个补提交卡去除的日期中”是错误的。反例是20 21 90,当m=1去除90,当m=2去除20&21. 发现反例的脚本代码可以参照 [hihocoder1039]字符消除
    转载请注明原文地址: https://ju.6miu.com/read-970719.html

    最新回复(0)