zoukankan      html  css  js  c++  java
  • 2020牛客暑期多校训练营(第九场)F

    Description

    (n) 种物品,每种物品有若干个,权值不同。要选出 (m) 种物品各 (1) 个使得其权值极差最小。

    Solution

    ((id,val))(val) 排序后,双指针即可,保证扫描区间内始终至少有 (m) 种物品即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    const int N = 2000005;
    
    struct Node 
    {
        int id;
        int val;
        bool operator < (const Node& b)
        {
            return val < b.val;
        }
    } a[N];
    
    int t1,t2,t3,n,m,ind,b[N];
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>t1;
            while(t1--)
            {
                cin>>t2;
                a[++ind]={i,t2};
            }
        }
        sort(a+1,a+ind+1);
        int pos=0,cnt=0,ans=1e9;
        for(int i=1;i<=ind;i++)
        {
            while(pos<ind && cnt<m)
            {
                ++pos;
                if(b[a[pos].id]==0) ++cnt;
                b[a[pos].id]++;
            }
            if(cnt>=m)
            {
                ans=min(ans,a[pos].val-a[i].val);
            }
            b[a[i].id]--;
            if(b[a[i].id]==0) --cnt;
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    P2P编程(十)
    9.25
    9.22
    pycharm常用快捷命令
    sublime常用快捷方式
    3.1
    总想听你说起不曾喜欢你
    1.1
    python 网络编程和并发编程题
    知识点梳理 网络基础
  • 原文地址:https://www.cnblogs.com/mollnn/p/13769867.html
Copyright © 2011-2022 走看看