zoukankan      html  css  js  c++  java
  • hihocoder-Weekly224-Split Array

    hihocoder-Weekly224-Split Array

    题目1 : 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

    题解:

      很简单的题目

      因为该数组是已经排好序的,而且其范围是1-10^6 , 可以用一个数组记录每一个数的cnt,然后顺序便利一遍,就可以判断。

      时间复杂度: O(10^6)  

    #include <cstdio>  
    #include <cstring> 
    #include <cstdlib> 
    const int MAXN = 100000 + 10; 
    
    #define max(a, b) (a)>(b)?(a):(b) 
    #define min(a, b) (a)>(b)?(b):(a) 
    
    int n, k, num[MAXN]; 
    
    int main(){ 
    
        int test_case;
        scanf("%d", &test_case);  
        int x, min_x, max_x, tmp;   
        bool ans; 
        while(test_case--)
        {
        	memset(num, 0, sizeof(num)); 
        	scanf("%d %d", &n, &k);  
        	max_x = 0; min_x = MAXN; 
        	for(int i=0; i<n; ++i)
        	{
        		scanf("%d", &x); 
        		num[x]++;  
        		max_x = max(max_x, x);  
        		min_x = min(min_x, x); 
        	} 
        	if(n%k != 0){
        		printf("NO
    ");
        		continue; 
        	}  
        	ans = true; 
        	for(int i=min_x; i<=max_x; ++i)
        	{
        		if(num[i] > 0)
        		{
        			tmp = num[i]; 
        			for(int j=0; j<k; ++j)
        			{
        				if(i+j > max_x){
        					ans = false; 
        					break; 
        				}
        				num[i+j] -= tmp; 
        			}
        		}else if(num[i] < 0)
        		{
        			ans = false; 
        			break; 
        		}
        	}
        	if(ans){
        		printf("YES
    ");
        	}else{
        		printf("NO
    ");
        	}
        } 
    } 
    

      

  • 相关阅读:
    笨办法学Python——学习笔记4
    意识、语言、文字和程序感想
    笨办法学Python——学习笔记3
    把vim作为shell ide
    HDUYuna's confusion 树状数组 Or Multiset
    POJ3252 Round Numbers 组合数学
    HDU3874 Necklace 树状数组+离线处理
    UVA10212 The Last Nonzero Digit. 分解质因子+容斥定理
    HDU1041 Computer Transformation 大数
    HDUFish买电脑 二分查找
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/9795073.html
Copyright © 2011-2022 走看看