zoukankan      html  css  js  c++  java
  • hdu5884 Sort

    //---------------------------------------------------------------
    /*---贪心策略+二分+队列
    -----将原数组排序,然后每次取k个较小的数合并,将合并的结果保存在一个队列中,继续取出k个数(队列和数组中)...
    -----但是会出现一个问题当(n-1)%(k-1)!=0时,这样最后剩下的数个数小于k,这会导致序列非严格递减。于是可以先将
    -----前(n-1)%(k-1)+1个数合并结果放入队列中,剩下的恰好可以每次合并k个数
    */
    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<string.h>
    typedef long long LL;
    using namespace std;
    
    const int maxn = 100000 + 5;
    int a[maxn];
    int n, T;
    
    bool findK(int k){
    	queue<LL>q;
    	LL ans = 0, s = 0;
    	int r = (n - 1) % (k - 1),p=0;
    	if (r){
    		while (p < r + 1) s += a[p++];
    
    		ans += s;
    		q.push(s);
    	}
    	while (true){
    		s = 0;
    		for (int i = 0; i < k; i++){
    			if (p < n && (q.empty() || a[p] < q.front())) s += a[p++];
    			else{
    				s += q.front();
    				q.pop();
    			}
    		}
    		ans += s;
    		if (ans>T)return false;
    		if (p >= n&&q.empty())break;
    		q.push(s);
    	}
    	return ans <= T;
    }
    
    int search(int l, int r){
    	while (l < r){
    		int k = (l + r) >> 1;
    		if (findK(k))
    			r = k;
    		else l = k + 1;
    	}
    	return r;
    }
    
    int main(){
    	int t;
    	scanf("%d", &t);
    	while (t--){
    		scanf("%d%d", &n, &T);
    		for (int i = 0; i < n; i++)scanf("%d", &a[i]);
    
    		sort(a, a + n);  //排序
    		printf("%d
    ", search(2, n));
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    常见的网络设备:集线器 hub、网桥、交换机 switch、路由器 router、网关 gateway
    Linux 路由表详解及 route 命令详解
    Flannel
    Flannel
    Hugo
    Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)
    Nginx 安装
    ETCD 简介及基本用法
    Vagrant 手册之 Multi-machine 多机器
    Vagrant 手册之 Provisioning
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5884710.html
Copyright © 2011-2022 走看看