zoukankan      html  css  js  c++  java
  • 前x个数据中至少有m个元素最小值与最大值之差不超过K

    题意

    给一组数据,从左到右开始,寻找最小的x,使得第1个元素到第x个元素中,至少存在m个数据,最小值与最大值之差不超过K。

    INPUT

    第一行是T,代表数据组数

    每组数据的第一行是三个整数,n、m、k。n代表数据个数,m、n、k小于1e5。

    第二行以此是n个数据,每个数据小于1e5。

    OUPUT

    如果存在这样的x,则输出x;否则输出"impossible"。

    解析

    二分法来处理原数据。如果中间元素满足题意,那么检测左区间;否则检测右区间。

    代码

    #include <stdio.h>
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    const int A = 1e5 + 10;
    int a[A], b[A];
    int n, m, k;
    
    bool check(int x) {
    	memcpy(b, a, sizeof(a));
    	sort (b + 1, b + x + 1);
    	for (int i = 1; i + m - 1 <= x; i++) {
    		int s = i, e = i + m - 1;
    		if (b[e] - b[s] <= k) return true;
    	}
    	return false;
    }
    
    int main() {
    	int T;
    	cin >> T;
    	while (T--) {
    		cin >> n >> m >> k;
    		for (int i = 1; i <= n; i++) {
    			cin >> a[i];
    		}
    		int ans = -1;
    		int l = m, r = n;
    		while (l <= r) {
    			int mid = (l + r) >> 1;
    			if (check(mid)) {
    				ans = mid;
    				r = mid - 1;
    			} 
    			else{
    				l = mid + 1;
    			}	
    		}
    		if (ans == -1) 
    			cout << "impossible" << endl;
    		else		   
    			cout << ans << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    TOMCAT添加管理用户认证
    NGINX配置详解及应用
    Zabbix部署
    NGINX+TOMCAT实现反向代理
    数据库-高级部分
    数据库-用户管理与pymysql
    数据库-表操作(CRUD)
    数据库-表关系练习
    数据库-表关系
    数据库-基础概念
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12241179.html
Copyright © 2011-2022 走看看