hihocoder-1051-补提交卡

小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序。100天过去了,小Ho查看自己的提交记录发现有N天因为贪玩忘记提交了。于是小Ho软磨硬泡、强忍着小Hi鄙视的眼神从小Hi那里要来M张"补提交卡"。每张"补提交卡"都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天。小Ho想知道通过利用这M张补提交卡,可以使自己的"最长连续提交天数"最多变成多少天。

(0 <= N, M <= 100)

分析:贪心

要想连续的天数,不提交卡肯定用在连续的空缺上,所以枚举从第一个空缺开始连续m,从二个空缺开始连续m......以此类推

对于每次枚举起点我的做法是:用得把数组的相应空缺位置b[i]置0,遍历数组b[],计算最大的连续天数

但是这次的枚举修改的b[],下次枚举要改回来,所以我直接利用函数的值传参特性,所以数组用的vector<int> b而不是用int b[],因为数组传参相当于指针传参,修改是有效的

 1 #include<iostream>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int t,n,m;
 8 int a[200];
 9
10
11 int func(vector<int> b,int i)
12 {
13     int ans=0;
14     for(int j=0;j<m;j++){
15         b[a[i+j]]=0;
16     }
17     int sum=0;
18     for(int i=1;i<=100;i++){
19         if(b[i]==0) sum++;
20         else{
21             ans=max(ans,sum);
22             sum=0;
23         }
24     }
25     return ans;
26 }
27
28 int main()
29 {
30     cin>>t;
31     while(t--){
32         cin>>n>>m;
33         vector<int> b(200);
34         for(int i=0;i<n;i++){
35             cin>>a[i];
36             b[a[i]]=1;
37         }
38         if(n<=m) cout<<100<<endl;
39         else{
40             sort(a,a+n);
41             int ans=0;
42             for(int i=0;i+m-1<n;i++){
43                 ans=max(ans,func(b,i));
44             }
45             cout<<ans<<endl;
46         }
47     }
48 }
时间: 2024-11-15 08:51:13

hihocoder-1051-补提交卡的相关文章

hihoCoder - 1051 - 补提交卡 (枚举,贪心!!)

#1051 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了,小Ho查看自己的提交记录发现有N天因为贪玩忘记提交了.于是小Ho软磨硬泡.强忍着小Hi鄙视的眼神从小Hi那里要来M张"补提交卡".每张"补提交卡"都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天.小Ho想知道通过利用这M张补提交卡,可以使自己的&

hihoCoder 1051 补提交卡 最详细的解题报告

题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数组中最长连续提交天数. 具体算法(Java版,直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 //计算数组中最长连续提交天数 6 public static int getMax(int[] array) { 7 int[] copy

hihoCoder 1051补提交卡(贪心 枚举)

http://hihocoder.com/problemset/problem/1051 既然要选择最长连续提交天数,那么提交卡必须连续使用才有可能得到最优解,这样贪心,然后从头到尾扫一遍求出最大值. 5 1 数组为a[i] 下标从1开始. 34 77 82 83 84 假如 提交卡用在 第一个数那么连续提交天数变成 a[2]-a[0]-1,第二个数 a[3]-a[1]-1,以此类推. 1 #include<cstdio> 2 #include<cstring> 3 int a[1

补提交卡

Badboy学长: 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<string> 6 #include<map> 7 #include<cstdio> 8 using namespace std; 9 10 int main(){ 11 int t,m,n,result; 12 int

[HIHO1051]补提交卡(枚举,贪心)

题目链接:http://hihocoder.com/problemset/problem/1051 思路:先排序,然后枚举连续的长度为m的子段,用这个段之后的第一个天数减去这个段之前的第一个天数再-1就是把这个区间全填上后的连续提交天数. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗

hiho_1051_补提交卡

题目大意 给出1到100这100个数中的某些数字(各个数字不同),这些数字形成一个个间断的连续区间,向1-100中添加M个数字,使得添加后1-100中某连续区间的长度最大,求出添加M个数字后,最长的连续区间的长度. 分析 计算机解决问题嘛,就是搜索解空间,不断的进行尝试(当然在尝试的基础上进行优化,就出现了DFS,BFS,DP,二分,递归,回溯等算法).如果尝试在空缺的位置上添加相应的数字,则指定超时.那么,尝试另一种方式进行搜索:对于区间[beg, end] 可以根据当前的情形得出要使得[be

hihocoder 在线测试(Google)

题目1 : 补提交卡 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去 了,小Ho查看自己的提交记录发现有N天因为贪玩忘记提交了.于是小Ho软磨硬泡.强忍着小Hi鄙视的眼神从小Hi那里要来M张"补提交卡".每张"补提 交卡"都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天.小Ho想知道通过利用这M张补提交卡,可以使自己的&

hihocoder 1036 Trie图(AC自动机)

传送门 Description 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本厚厚的河蟹词典,而他们要做的是判断这篇文章中是否存在那些属于河蟹词典中的词语. 当时,小Hi和小Ho的水平还是十分有限,他们只能够想到:“枚举每一个单词,然后枚举文章中可能的起始位置,然后进行匹配,看能否成功.”这样非常朴素的想法,但是这样的算法时间复杂度是相当高的,如果说词典的词语数量为N,每个词语长度为L,文章的长度为M,那么需要进行的计算次数是在N

hihoCoder #1036 : Trie图 (AC自动机)

#1036 : Trie图 时间限制:20000ms 单点时限:1000ms 内存限制:512MB 描述 前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本厚厚的河蟹词典,而他们要做的是判断这篇文章中是否存在那些属于河蟹词典中的词语. 当时,小Hi和小Ho的水平还是十分有限,他们只能够想到:"枚举每一个单词,然后枚举文章中可能的起始位置,然后进行匹配,看能否成功."这样非常朴素的想法,但是这样的算法时间复杂度是相当