Codeforces Round #679 (Div. 2, based on Technocup 2021 Elimination Round 1) C. Perform Easily

题目:https://codeforces.com/contest/1435/problem/C

n个数b[i]与6个数a[j],问对于每个b[i],选一个a[j]做差,使最后最大的b[i]-a[j]与最小的b[i]-a[j] 的差尽可能小。

思路:

设n个b[i]对应n个id,每个id对应的b[id]分别与a[j]做差得到6*n个数,把这6个数排序,然后尺取维护区间的不同id个数为n,取区间中最小的极差。

普通尺取也可以,也可以用multiset来写(set自带排序)。

#include<bits/stdc++.h>
#include<ext/rope>
//#include<hash_map>
#define sd(x) scanf("%d",&x)
#define lsd(x) scanf("%lld",&x)
#define ms(x,y) memset(x,y,sizeof x)
#define fu(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define all(a) a.begin(),a.end()
using namespace std;
using namespace __gnu_cxx;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int maxn=1e5+91;
const int mod=1e9+7;
const int INF=1e9+7;
const double pi=acos(-1);
multiset< pair<int,int> > s;
int a[10],b[maxn],id[maxn];
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    //freopen("t.txt","r",stdin);
    fu(i,1,6) cin>>a[i];
    int n;cin>>n;
    fu(i,1,n) cin>>b[i];
    fu(i,1,n)
    {
        fu(j,1,6)
        {
            s.insert(make_pair(b[i]-a[j],i));
        }
    }
    if(n==1) //特判一个的情况,不然TTT,因为我用的set一边尺取一边删
    {
        cout<<0<<endl;
        return 0;
    }
    int ans=INF,cnt=0;
    for(auto p:s)
    {
        if(!id[p.second]) cnt++;
        id[p.second]++;  
        while(cnt==n&&id[(*s.begin()).second])
        {
            pair<int,int> fis=*s.begin(); 
            ans=min(ans,p.first-fis.first); 
            s.erase(s.begin(),++s.begin());
            id[fis.second]--;
            if(!id[fis.second]) cnt--;
        }
        
    }
    cout<<ans<<endl;
    return 0;
}

 

posted on 2020-10-26 11:27  Aminers  阅读(175)  评论(0编辑  收藏  举报

导航