zoukankan      html  css  js  c++  java
  • 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;
    }
    
    知足常乐!
  • 相关阅读:
    POJ
    POJ
    操作系统
    POJ
    POJ
    codeforces Educational Round 89
    codeforces Round 647(div. 2)
    codeforces Educational Round 88
    后缀自动机简单总结
    dsu on tree 简单总结
  • 原文地址:https://www.cnblogs.com/yjsh/p/14411245.html
Copyright © 2011-2022 走看看