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; }