zoukankan      html  css  js  c++  java
  • 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
    ");
    			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
    ", max_continuous);
    	}
    	return 0;
    }
    
  • 相关阅读:
    java 上传图片
    getElementById 鼠标经过字体改变颜色
    getElementById 学习
    css的绝对定位与相对定位
    关于For循环
    扩展方法的应用
    关于Function 的学习笔记
    <a>标签中查找文件的方法
    关于Name ID class属性的区别
    使用float设置经典的网站前端结构
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/5511088.html
Copyright © 2011-2022 走看看