CF1435C Perform Easily(Set)

与Shikamaru战斗之后,Tayuya决定她的长笛太可预测了,并用吉他代替了。吉他有6根琴弦和无数个从1开始编号的琴格。在第i弦上微调琴格编号j会产生音符ai + j。

Tayuya想要演奏n个音符的旋律。每个音符可以用不同的弦乐组合演奏。演奏的难易程度取决于所用琴格的最大和最小索引之间的差异。这种差异越小,执行该技术就越容易。请确定可能的最小差异。

例如,如果a = [1,1,2,2,3,3],并且音符序列为4,11,11,12,12,13,13(对应于第二个示例),我们可以玩第一个字符串的第一个音符,第六个字符串的所有其他音符。如图所示,然后最大品格为10,最小品格为3,答案为10-3 = 7。


输入值
第一行包含6个以空格分隔的数字a1,a2,...,a6(1≤ai≤109),它们描述了Tayuya的弦。

第二行包含唯一的整数n(1≤n≤100000),代表旋律中音符的数量。

第三行由n个整数b1,b2,...,bn(1≤bi≤109)组成,以空格分隔。他们描述了要演奏的音符。保证所有1≤i≤n和1≤j≤6的bi> aj,换句话说,您可以在任何字符串上弹奏每个音符。

输出量
打印所用品格的最大和最小索引的最小可能差异。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int n,a[maxn],b[maxn];
set<pair<int,int> > st;
int id[maxn];
int main () {
    for (int i=1;i<=6;i++) scanf("%d",a+i);
    sort(a+1,a+7);
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",b+i);
    for (int i=1;i<=n;i++) {
        id[i]=6;
        st.insert(make_pair(b[i]-a[id[i]],i));
    }
    int ans=(*st.rbegin()).first-(*st.begin()).first;
    set<pair<int,int> > ::iterator p;
    while (1) {
        p=st.begin();
        int u=p->second;
        st.erase(p);
        if (id[u]==1) break;
        id[u]--;
        st.insert(make_pair(b[u]-a[id[u]],u));
        ans=min(ans,(*st.rbegin()).first-(*st.begin()).first);
    } 
    printf("%d
",ans);
} 
原文地址:https://www.cnblogs.com/zhanglichen/p/13884707.html