zoukankan      html  css  js  c++  java
  • Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18

    source: https://hihocoder.com/contest/hihointerview27/problems

    题目1 : Big Plus

    描述

    Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix.

    size 1 plus   size 2 plus   size 3 plus  size 4 plus
         1                1              1                1
        111               1              1                1
         1              11111            1                1
                          1           1111111             1
                          1              1            111111111
                                         1                1
                                         1                1
                                                          1
                                                          1
    

    输入

    The first line contains an integer N. (1 <= N <= 500)  

    Then follow an NxN 01 matrix.

    输出

    The size of the biggest plus in the matrix.

    样例输入5  
    00100  
    00100  
    11111  
    00110  
    10101
    样例输出  2
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring> 
    using namespace std;
    const int MAXN = 505;
    
    int n, ans; 
    char mp[MAXN][MAXN];
    int U[MAXN][MAXN], D[MAXN][MAXN], LEF[MAXN][MAXN], RIG[MAXN][MAXN]; 
    
    int main(){
    	int tmp; 
    	while(scanf("%d", &n) != EOF){
    		for(int i=1; i<=n; ++i){
    			getchar(); 
    			for(int j=1; j<=n; ++j){
    				scanf("%c", &mp[i][j]);
    			}
    		}
    		memset(U, 0, sizeof(U)); memset(D, 0, sizeof(D)); 
    		memset(LEF, 0, sizeof(LEF)); memset(RIG, 0, sizeof(RIG)); 
    		for(int i=1; i<=n; ++i){
    			for(int j=1; j<=n; ++j){
    				if(mp[i][j] == '1'){
    					U[i][j] = U[i-1][j] + 1; 
    					LEF[i][j] = LEF[i][j-1] + 1; 
    				}
    			}
    		}
    		for(int i=n; i>=1; --i){
    			for(int j=n; j>=1; --j){
    				if(mp[i][j] == '1'){
    					D[i][j] = D[i+1][j] + 1; 
    					RIG[i][j] = RIG[i][j+1] + 1; 
    				}
    			}
    		}
    		ans = 0; 
    		for(int i=1; i<=n; ++i){
    			for(int j=1; j<=n; ++j){
    				if(mp[i][j] == '1'){
    					tmp = min(min(U[i][j], RIG[i][j]), min(D[i][j], LEF[i][j])); 
    					if(tmp-1 > ans){
    						ans = tmp - 1; 
    					}
    				}
    			}
    		}
    		printf("%d
    ", ans );
    	}
    	return 0; 
    }
    

      

    题目2 : Interval Coverage

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    You are given N intervals [S1, T1], [S2, T2], [S3, T3], ... [SN, TN] and a range [X, Y]. Select minimum number of intervals to cover range [X, Y].

    输入

    The first line contains 3 integers N, X and Y. (1 <= N <= 100000, 1 <= X < Y <= 1000000)

    The following N lines each contain 2 integers Si, Ti denoting an interval. (1 <= Si < Ti <= 1000000)

    输出

    Output the minimum number of intevals to cover range [X, Y] or -1 if it is impossible.

    样例输入
    5 1 5
    1 2    
    1 3  
    2 4  
    3 5  
    4 5 
    样例输出
    2
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring> 
    using namespace std;
    const int MAXN = 100000 + 5;
    struct Interval{
    	int s, t; 
    }inte[MAXN]; 
    int n, x, y;
    
    int cmp(const void *a, const void *b){
    	Interval *aa = (Interval *)a; 
    	Interval *bb = (Interval *)b; 
    	if(aa->s == bb->s){
    		return aa->t - bb->t; 
    	}
    	return aa->s - bb->s; 
    }
    int main(){
    	freopen("in.txt", "r", stdin); 
    
    	int ans, far, start; 
    	while(scanf("%d %d %d", &n, &x, &y) != EOF){
    		for(int i=0; i<n; ++i){
    			scanf("%d %d", &inte[i].s, &inte[i].t); 
    		}
    		qsort(inte, n, sizeof(inte[0]), cmp); 
    		if(inte[0].s > x){
    			ans = -1; 
    		}else{
    			far = max(x, inte[0].t); 
    			start = x; 
    			ans = 1; 
    			for(int i=0; i<n; ++i){
    				if(far >= y){
    					break; 
    				}
    				if(inte[i].s <= start){
    					far = max(far, inte[i].t); 
    				}else if(inte[i].s > far){
    					break; 
    				}else{
    					start = far; 
    					far = max(far, inte[i].t); 
    					++ans; 
    				}
    			}
    			if(far < y){
    				ans = -1; 
    			}
    		}
    		printf("%d
    ", ans );
    	}
    	return 0; 
    }
    

      

    题目3 : Split Array

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    You are given an sorted integer array A and an integer K. Can you split A into several sub-arrays that each sub-array has exactly K continuous increasing integers.

    For example you can split {1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6}  into {1, 2, 3}, {1, 2, 3}, {3, 4, 5}, {4, 5, 6}.  

    输入

    The first line contains an integer T denoting the number of test cases. (1 <= T <= 5)

    Each test case takes 2 lines. The first line contains an integer N denoting the size of array A and an integer K. (1 <= N <= 50000, 1 <= K <= N)

    The second line contains N integers denoting array A. (1 <= Ai <= 100000)

    输出

    For each test case output YES or NO in a separate line.

    样例输入
    2  
    12 3 
    1 1 2 2 3 3 3 4 4 5 5 6  
    12 4  
    1 1 2 2 3 3 3 4 4 5 5 6
    样例输出
    YES  
    NO
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring> 
    using namespace std;
    const int MAXN = 50000 + 5;
    const int MAXV = 100000 + 5; 
    
    int n, k, num[MAXV]; 
    int main(){
    	freopen("in.txt", "r", stdin); 
    
    	int test_case, val, maxval, tmp, flag;   
    	scanf("%d", &test_case); 
    
    	while(test_case--){
    		scanf("%d %d", &n, &k); 
    		maxval = 0; 
    		memset(num, 0, sizeof(num)); 
    		for(int i=0; i<n; ++i){
    			scanf("%d", &val); 
    			num[val]++; 
    			maxval = max(maxval, val); 
    		}
    		flag = 1; 
    		for(int i=1; i<=maxval; ++i){
    			if(num[i] > 0){
    				tmp = num[i]; 
    				for(int j=0; j<k; ++j){
    					num[i+j] -= tmp; 
    				}
    			}else if(num[i] < 0){
    				flag = 0;
    				break; 
    			}
    		}
    		if(flag){
    			printf("YES
    ");
    		}else{
    			printf("NO
    ");
    		}
    	}
    	return 0; 
    }
    

      

  • 相关阅读:
    学习日记-- 动态性。动态编译,静态方法,包装类
    第一周学习所获———ORM,数据持久化,通过注解来实现数据持久化框架
    第一周学习所获--class类1(反射和类加载过程)
    各种命名规范
    用easyui,json,纯mvc实现一个系统的数据流动过程
    js+bootstrap实现分页页码
    Echarts简单案例
    bootstrap日期控件(双日期、清空等问题解决)
    三种方法实现调用Restful接口
    Spring MVC异常处理 和 重定向传递数据
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6220549.html
Copyright © 2011-2022 走看看