• Codeforces Round #509 (Div. 2)


    比赛链接: https://codeforces.com/contest/1041

    A题:给你n个数,问你最大的和最小的数之间有多少个未写的数,那就找出写的数字然后再减去就好了

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int mmax = -1,mmin = 1e10;
        for(int i = 0,x;i < n;i ++){
            cin >> x;
            mmax = max(mmax,x);
            mmin = min(mmin,x);
        }
        cout << mmax - mmin - n + 1 << endl;
        return 0;
    }
    

    B题:找出最大公约数,然后算一下a / x,和b/y哪个小就行

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int main()
    {
        LL a,b,x,y;
        cin >> a >> b >> x >> y;
        
        
        LL t = __gcd(x,y);
        x = x / t;
        y = y / t;
        cout << min(a / x,b/y) << endl;
        
        
        return 0;
    }
    
    

    C题:信息1:就是问最少多长时间能喝完咖啡,每一个想喝咖啡的时间点都得喝咖啡。信息2:给你n个时间点,每天工作m分钟,两次喝咖啡时间大于等于d,问你几天能喝完

    • 这个问题很常见了,有点像食堂打饭,至少安排几个窗口问题一样,优先队列,二分好像也可以做这个题
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int n,m,d;
    const int N = 1e6 + 10;
    pair<int,int> a[N];
    LL b[N];
    
    int main()
    {
        cin >> n >> m >> d;
        d ++;
        for(int i = 1;i <= n;i ++){
            cin >> a[i].first;
            a[i].second = i;
        }
        
        sort(a + 1,a + n + 1);
        
        int day = 0;
        
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
        
        for(int i = 1;i <= n;i ++){
           // cout << i << ' ' << a[i].second << endl;
            if(q.size() == 0){
                q.push({a[i].first + d,++ day});
                b[a[i].second] = 1;
                continue;
            }
            auto t = q.top();
            if(t.first <= a[i].first){
                b[a[i].second] = t.second;
                q.pop();
                q.push({a[i].first + d,t.second});
            }else{
                b[a[i].second] = ++ day;
                q.push({a[i].first + d,day});
            }
        }
        
        cout << day << endl;
        
        for(int i = 1;i <= n;i ++){
            cout << b[i] << ' ';
        }
         
        
        return 0;
    }
    
    

    D题:信息1:有一个玩滑翔伞的,从h高度的地方往下飞,x减一的同时y减一,有些地方有上升气流,他处于这些区域的时候y不变,他可以随意选择一个x往下跳,问飞行的最远距离是多少


    • 前缀和 + 二分,二分的目的是找到大于等于间隔点超过当前点h的点的前一个点
    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long LL;
    const int N = 1e6 + 10;
    int sum1[N];
    int sum2[N];
    
    int main()
    {
        int n,h;
        cin >> n >> h;
        
        int back = 0;
        
        for(int i = 1,l,r;i <= n;i ++){
            cin >> l >> r;
            sum1[i] = sum1[i - 1] + r - l;
            sum2[i] = sum2[i - 1] + l - back;
            back = r;
        }
        int ans = 0;
        for(int i = 1;i <= n;i ++){
            
            int pos = lower_bound(sum2 + 1,sum2 + n + 1,sum2[i] + h) - sum2;
            ans = max(sum1[pos - 1] - sum1[i - 1],ans);
        }
        
        cout << ans + h << endl;
        
        
        return 0;
    }
    
    知足常乐!
  • 相关阅读:
    微信朋友圈怎么发文字?如何只发文字和表情?
    微信将推指纹支付 "指付通"会与Touch ID整合吗
    微信公众平台上传图片很卡 微信整合京东的关系?
    微信公众平台可以修改名称吗?微信认证时可以改名!
    怎样制作漂亮的微信二维码?用在线二维码生成器!
    微信网页版APP
    织梦channelid是什么?dede channel typeid有什么区别
    微信消息如何添加文字链接?【微信公众平台技巧】
    为什么在有些文章末尾加一张收录截图?
    5步教你设置微信自定义菜单【微信公众平台技巧】
  • 原文地址:https://www.cnblogs.com/yjsh/p/14411245.html
Copyright © 2020-2023  润新知