• Nowcoder9983B.内卷(双指针)


    链接:https://ac.nowcoder.com/acm/contest/9983/B
    来源:牛客网

    在一个班级里有nmathit nn个同学,在这个即将进行数据结构期末考试的关头,为了减少内卷,他们决定聚在一起商量对策。
    每个人在考试后会得到一个A,B,C,D,Emathit A,B,C,D,EA,B,C,D,E的等级和一个分数,学校要求得到等级Amathit AA的人不超过kmathit kk个。
    已知第imathit ii个同学在得到五个等级时预期的分数分别为ai,bi,ci,di,eia_{i},b_{i},c_{i},d_{i},e_{i}ai,bi,ci,di,ei
    请问在最理想的情况且不违反上述条件的情况下,他们的预期分数最大值和最小值之差最小为多少。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+100;
    int n,k;
    int A[maxn],B[maxn],C[maxn],D[maxn],E[maxn];
    set<int> st,sa;
    map<int,int> mp,ma;
    vector<pair<int,pair<int,int> > > v; 
    int cnt;
    int main () {
        scanf("%d%d",&n,&k);
        for (int i=1;i<=n;i++) scanf("%d%d%d%d%d",A+i,B+i,C+i,D+i,E+i);
        for (int i=1;i<=n;i++) {
            v.push_back(make_pair(A[i],make_pair(i,1)));
            v.push_back(make_pair(B[i],make_pair(i,2)));
            v.push_back(make_pair(C[i],make_pair(i,3)));
            v.push_back(make_pair(D[i],make_pair(i,4)));
            v.push_back(make_pair(E[i],make_pair(i,5)));
        }
        sort(v.begin(),v.end());
        int l=0,r=0;
        int ans=1e9;
        while (l<v.size()) {
            while (r<=v.size()) {
                if (r==v.size()||st.size()==n) {
                    //如果当前已经有n个不同的人
                    //同时只有a的人小于等于k
                    //则更新答案 
                    if (sa.size()<=k&&st.size()==n) {
                        //printf("%d %d %d %d
    ",sa.size(),l,r-1,v[r-1].first-v[l].first);
                        ans=min(ans,v[r-1].first-v[l].first);
                    }
                    break;
                }
                //如果这个人本来在区间不存在,就插入 
                if (!mp[v[r].second.first]) {
                    st.insert(v[r].second.first);
                }    
                mp[v[r].second.first]++;
                
                //如果这个人的属性不是a,且他本来不存在除a以外的元素
                //就把他从sa里面删除
                //同时更新ma ma不为0表示他存在除a以外的元素 
                if (v[r].second.second!=1) {
                    //如果第r元素不是A 
                    if (!ma[v[r].second.first])    sa.erase(v[r].second.first);//如果它本身不存在除a以外的元素,现在存在了,就把它在sa里删掉 
                    ma[v[r].second.first]++;
                }
                else if (v[r].second.second==1) {
                    if (mp[v[r].second.first]==1) sa.insert(v[r].second.first);
                }
                r++;
            }
            //如果他是最后一个 ,就把他的信息从sa和st里面删掉 
            mp[v[l].second.first]--;
            if (!mp[v[l].second.first]) sa.erase(v[l].second.first),st.erase(v[l].second.first);
            //如果他不是最后一个,同时这个属性不为A,则ma里对应的项--
            //如果-完了, 
            else if (v[l].second.second!=1) {
                ma[v[l].second.first]--;//ma表示不存在除a以外的学生人数 
                if (!ma[v[l].second.first]) sa.insert(v[l].second.first);
            }
            
            l++;
        }
        printf("%d
    ",ans);
        //A不能超过k个
        //就用A最小的k个 
        //双指针
        //如果区间内刚好包含n个不同的人同时A的元素数小于等于k 
    } 
  • 相关阅读:
    模块移植-加宏选择性编译
    模块-各个模块的路径所在
    ubuntu-系统卡慢解决(转载)
    meld文件的脚本
    artTemplate模板引擎
    前端完全分离和前端不完全分离
    px em rem的区别
    原型和原型链
    阻止默认事件
    document.ready和onload的区别
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14381173.html
Copyright © 2020-2023  润新知