Codeforces Gym101234G Dreamoon and NightMarket(优先队列,子集和第k大)

题意:

求子集和第k大,n,k<=1e6

思路:

优先队列经典题目,注意优先队列是默认按从大到小排的

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>

#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) 

using namespace std;

typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 4e5+100;
const int maxm = 4e5+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

int n, k;
ll a[maxn];
priority_queue<pair<ll, int> ,vector<pair<ll,int>>, greater<pair<ll,int>> >q;

//priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > >q;
int main(){
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i++){
        scanf("%lld", &a[i]);
    }
    sort(a+1,a+1+n);
    q.push({a[1],1});
    int cnt = 0;

    while(cnt < k){
        auto tmp = q.top();
        q.pop();
        ll ans = tmp.fst;
        int id = tmp.sc;
        if(id < n){
            q.push({ans+a[id+1],id+1});
            q.push({ans-a[id]+a[id+1], id+1});
        }
        cnt++;
        if(cnt == k){
            printf("%lld\n", ans);
            break;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/10660258.html

时间: 2024-10-21 11:44:07

Codeforces Gym101234G Dreamoon and NightMarket(优先队列,子集和第k大)的相关文章

Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验

Special subset sums: meta-testing Let S(A) represent the sum of elements in set A of size n. We shall call it a special sum set if for any two non-empty disjoint subsets, B and C, the following properties are true: S(B) ≠ S(C); that is, sums of subse

c2java 回溯,下一个排列和子集和

穷举:生成所有候选解,然后找出需要的解. 回溯:把解表示成向量,每个分量取自一个有限集合.从部分解开始,每次添加解的一个分量,然后判断如果有可能扩展成完整解则递归下去,否则换成下一个.可以看做是隐式图上的深度优先搜索. 回溯/穷举的复杂度,最坏时和后者一样,通常情形因为不必遍历所有子节点,还是比较快的. 回溯框架: backtrack(a[], k) if a[0,...,k] is a solution output; else k = k + 1; for c: the i-th of ca

2.分治算法研究-搜索数组中的最大连续子集和 2014-3-11 11:37 阅读(16)

//分治算法研究var cc=consolefunction find_max_crossing_subarray(A,low,mid,high){    var max_left=mid,max_right=mid    var left_sum=0    var sum=0    for(var i=mid;i>=low;i--){        sum=sum+A[i]        if(sum>left_sum){            left_sum=sum           

STL--H - Black Box(两个优先队列,求第k小的值)

H - Black Box Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black

(算法竞赛入门经典 优先队列)LA 3135(前K条指令)

A data stream is a real-time, continuous, ordered sequence of items. Some examples include sensor data, Internet traffic, financial tickers, on-line auctions, and transaction logs such as Web usage logs and telephone call records. Likewise, queries o

CodeForces 754D Fedor and coupons (优先队列)

题意:给定n个优惠券,每张都有一定的优惠区间,然后要选k张,保证k张共同的优惠区间最大. 析:先把所有的优惠券按左端点排序,然后维护一个容量为k的优先队列,每次更新优先队列中的最小值,和当前的右端点, 之间的距离.优先队列只要存储右端点就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <

CodeForces - 948C Producing Snow(优先队列)

题意: n天. 每天你会堆一堆雪,体积为 v[i].每天都有一个温度 t[i] 所有之前堆过的雪在第 i 天体积都会减少 t[i] . 输出每天融化了的雪的体积. 这个题的正解我怎么想都很难理解,但是慢慢理解了. 计算一个 t[i] 的前缀和 sum. 那么到第 j 天时,设第 i 堆雪融化的体积是 V,则 V = min (sum [ j ] - sum[ i-1], v[ i ] ) 所以把 v[ i ] + sum[ i -1] 加入优先队列里,就可以只处理所有当天能化完的雪了. 若 su

38.Subsets(子集和)

Level: ??Medium 题目描述: Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2]

HDU - 5765 Bonds 思维 + sosdp(子集和dp)

HDU - 5765 一个bond肯定把n个点分成两个连通块, 并且每个集合对应一个bond, 因为当前这个集合属于第一个连通块, 那么它的补集就输入另一个连通块, ok[ mask ] 表示 mask这些点集能否成为一个连通块. 我们称一个分配方案mask是好的当且仅当ok[ mask ] == true && ok[ ~mask ] = true; 那么我们考虑一条边(u, v)属于多少个bond, 也就是总的合法的分配方案  减去 u, v在同一个点集里的方案数. 我们考虑sosdp