hiho_1051_补提交卡

题目大意

给出1到100这100个数中的某些数字(各个数字不同),这些数字形成一个个间断的连续区间,向1-100中添加M个数字,使得添加后1-100中某连续区间的长度最大,求出添加M个数字后,最长的连续区间的长度。

分析

计算机解决问题嘛,就是搜索解空间,不断的进行尝试(当然在尝试的基础上进行优化,就出现了DFS,BFS,DP,二分,递归,回溯等算法)。如果尝试在空缺的位置上添加相应的数字,则指定超时。那么,尝试另一种方式进行搜索:对于区间[beg, end] 可以根据当前的情形得出要使得[beg, end]区间内连续,需要填充的数字的个数,这样,枚举[beg, end]进行搜索,同时记录需要填充M个数字才能连续的区间的最大长度。复杂度O(100*100)。

体会 
    计算机最适合机械的搜索,但要解决问题,还需要设计一个“合理”的搜索方式,“合理”的意思是,可以用程序去执行,同时时空复杂度可接受。

实现

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
bool used[105];
int need2continuous[105][105];
int main(){
	int T, n, m, empty, max_continuous;
	scanf("%d", &T);
	while (T--){
		scanf("%d %d", &n, &m);
		memset(used, true, sizeof(used));
		memset(need2continuous, 0, sizeof(need2continuous));
		for (int i = 0; i < n; i++){
			scanf("%d", &empty);
			used[empty] = false;
		}
		max_continuous = 0;
		if (m >= n){
			printf("100\n");
			continue;
		}

		for (int begin = 1; begin <= 100; begin++){
			for (int end = begin; end <= 100; end++){
				if (begin == end)
					need2continuous[begin][end] = !used[begin];
				else{
					need2continuous[begin][end] = need2continuous[begin][end - 1] + !used[end];
				}
				if (need2continuous[begin][end] == m){
					max_continuous = max_continuous > (end - begin + 1) ? max_continuous : end - begin + 1;
				}
			}
		}
		printf("%d\n", max_continuous);
	}
	return 0;
}
时间: 2024-08-28 16:35:04

hiho_1051_补提交卡的相关文章

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

补提交卡

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

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

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

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

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

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

hihocoder-1051-补提交卡

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

hihocoder 在线测试(Google)

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

学习打卡功能上线,告别懒惰,坚持学习!

为什么打卡? ① 打卡是什么? 每天完成了至少30分钟的学习任务后,你就可以点击打卡,自豪地为自己记录一笔. 通过打卡你可以直观地看到自己累积学习的天数记录,日积月累,满满的打卡记录就是你迈向成功的见证! 所有的打卡记录均可在PC端"我的学习中心-学习打卡"页面查看. ② 如何打卡? 打卡时间为每天0点-24点,登陆学院网站.APP后学习课程满30分钟即可打卡:若超过了 24 点,当天则无法打卡,也无法补打卡,累积学习天数将被清零. (目前只能在PC端打卡,APP中无法操作) ③ 打卡

【干货分享】流程DEMO-补打卡

流程名: 补打卡申请 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单:  流程: 图片:2.png DEMO包下载: http://files.cnblogs.com/files/1774bpm/%E8%A1%A5%E6%89%93%E5%8D%A1.zip