首页 > 其他分享 >P7913 [CSP-S 2021] 廊桥分配

P7913 [CSP-S 2021] 廊桥分配

时间:2023-09-26 18:11:25浏览次数:36  
标签:q1 cnt int P7913 id 廊桥 include CSP

暴力枚举

枚举国内和国外的廊桥数量配额,再模拟航班停机过程

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100005;
struct Flight {
    int l, r; // l 抵达时刻,r 离开时刻
    bool operator<(const Flight& other) const {
        return l < other.l;
    }
};
Flight a[N], b[N]; // a 国内,b 国际
int t[N]; // 廊桥目前停靠飞机的离开时刻
int solve(Flight f[], int m, int len) {
    for (int i = 1; i <= len; i++) t[i] = 0;
    int cnt = 0;
    for (int i = 1; i <= m; i++) {
        int id = 0;
        for (int j = 1; j <= len; j++) 
            if (f[i].l >= t[j]) {
                id = j; break;
            } 
        if (id != 0) {
            t[id] = f[i].r; cnt++;
        }
    }
    return cnt;
}
int main()
{
    int n, m1, m2;
    scanf("%d%d%d", &n, &m1, &m2);
    for (int i = 1; i <= m1; i++) scanf("%d%d", &a[i].l, &a[i].r);
    for (int i = 1; i <= m2; i++) scanf("%d%d", &b[i].l, &b[i].r);
    // 按抵达时间排序
    sort(a + 1, a + m1 + 1); sort(b + 1, b + m2 + 1);
    int ans = 0;
    for (int x = 0; x <= n; x++) {
        // 给国内航班预留 x 个廊桥,国外航班预留 n-x 个
        int y = n - x;
        int cnt1 = solve(a, m1, x);
        int cnt2 = solve(b, m2, y);
        ans = max(ans, cnt1 + cnt2);
    }
    printf("%d\n", ans);
    return 0;
}

正解

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 100005;
struct Flight {
    int arrive, leave;
    bool operator<(const Flight& other) const {
        return arrive < other.arrive;
    }
};
Flight f1[MAXN], f2[MAXN];
int cnt1[MAXN], cnt2[MAXN], sum1[MAXN], sum2[MAXN];
struct Bridge {
    int time, id;
};
struct BridgeCompare {
    bool operator()(const Bridge &lhs, const Bridge &rhs) const {
        return lhs.time > rhs.time;
    }
};
priority_queue<Bridge, vector<Bridge>, BridgeCompare> q1;
priority_queue<int, vector<int>, greater<int>> q2;
void distribute(Flight f[], int cnt[], int m) {
    while (!q1.empty()) q1.pop();
    while (!q2.empty()) q2.pop();
    for (int i = 1; i <= m; i++) {
        while (!q1.empty() && q1.top().time <= f[i].arrive) {
            q2.push(q1.top().id);
            q1.pop();
        } 
        if (q2.empty()) {
            int len = ++cnt[0];
            cnt[len] = 1;
            q1.push({f[i].leave, len});
        } else {
            cnt[q2.top()]++;
            q1.push({f[i].leave, q2.top()});
            q2.pop();
        }
    }
}
int main()
{
    int n, m1, m2;
    scanf("%d%d%d", &n, &m1, &m2);
    for (int i = 1; i <= m1; i++) scanf("%d%d", &f1[i].arrive, &f1[i].leave);
    for (int i = 1; i <= m2; i++) scanf("%d%d", &f2[i].arrive, &f2[i].leave);
    sort(f1 + 1, f1 + m1 + 1);
    sort(f2 + 1, f2 + m2 + 1);
    distribute(f1, cnt1, m1);
    distribute(f2, cnt2, m2);
    for (int i = 1; i <= n; i++) sum1[i] = sum1[i - 1] + cnt1[i];
    for (int i = 1; i <= n; i++) sum2[i] = sum2[i - 1] + cnt2[i];
    int ans = 0;
    for (int i = 0; i <= n; i++) {
        ans = max(ans, sum1[i] + sum2[n - i]);
    }
    printf("%d\n", ans);
    return 0;
}

标签:q1,cnt,int,P7913,id,廊桥,include,CSP
From: https://www.cnblogs.com/ronchen/p/17730867.html

相关文章

  • CSP模拟45
    CSP模拟45题解已经快20场模拟赛没写题解了???T1难下次我一定要先看\(T1\)QAQ。对于\(a\)串里第\(i\)位的字母,在\(b\)串里面会重复计算的是与\(a\)串里面\(i\)位字母相同的字母,所以将两个串中相同的字母的出现次数乘起来就行#include<iostream>#include<cstring>......
  • 2023年CSPM-3国标项目管理中级认证多数人都认可这家
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • P5659 [CSP-S2019] 树上的数
    P5659[CSP-S2019]树上的数前言被队友(大爹)易giegie要求做这道题,一天一夜绞尽脑汁终于写出来了。(下了样例test1调试)然后被要求写博客虽然我觉得没啥用,但是写一下吧一些说明1.把数在删边时交换的过程看做移动,停留过的点和相关的边认为是经过这些点和边2.把一条边看做两条有......
  • CSP-S 2023 游记
    蒟蒻的第一次CSP&第一篇游记。同时应该也是最后一次CSP。第一轮Day998244350下载准考证。Day0(2023.9.16)和学校请了一天的假,成功错过三门考试。血赚.jpg上午看了看CSP初赛复习,写了喵了个喵,但没调完。在谷上看到CSP-J出锅,希望CSP-S无锅。Day499122177来到......
  • CSP-S 2023 游记
    高中OI生涯开端。9.16初赛小图灵估分81.5,比去年稍微低一点,不过过初赛应该是没问题了。2B铅笔坏了导致耽误了一些时间,最后没有充足的时间去检查,还把一道原本选对的题改错了/kk,以及一道题看反了,还有零零碎碎的小错误,导致了这个分数。不过再怎么说也应该是过初赛了,希望复赛......
  • P7916 [CSP-S 2021] 交通规划 sol-最短路+环形dp
    P7916[CSP-S2021]交通规划solStatement传送门Solution好题。发现\(k\le2\)的分值非常多,于是我们考虑从\(k=2\)入手。颜色相同就不用说了,直接染成同一种颜色就行了。我们考虑其他情况,就是颜色不相同的情况,我们一定是找了一条路径把这个图给切开了就像这个样子。......
  • HTTP安全响应头配置之Content-Security-Policy(csp)
    什么是CSPCSP全称ContentSecurityPolicy ,可以直接翻译为内容安全策略,说白了,就是为了页面内容安全而制定的一系列防护策略.通过CSP所约束的的规责指定可信的内容来源(这里的内容可以指脚本、图片、iframe、fton、style等等可能的远程的资源)。通过CSP协定,让WEB处于一个安全的运......
  • 「解题报告」CSP - S 2019
    总分:100+55+10+32+12+40=249。[CSP-S2019]格雷码题目描述通常,人们习惯将所有\(n\)位二进制串按照字典序排列,例如所有2位二进制串按字典序从小到大排列为:00,01,10,11。格雷码(GrayCode)是一种特殊的\(n\)位二进制串排列法,它要求相邻的两个二进制串间恰好有一位......
  • [CSP-S 2022 T1] 假期计划
    #include<cstdio>#include<vector>#include<queue>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=2505;vector<int>G[N];intdis[N],top3[N][3];boolvis[N],ok[N][N];LLs[N];intmain(){......
  • [CSP-J 2021] 插入排序
    题目描述插入排序是一种非常常见且简单的排序算法。小Z是一名大一的新生,今天H老师刚刚在上课的时候讲了插入排序算法。假设比较两个元素的时间为\(\mathcalO(1)\),则插入排序可以以\(\mathcalO(n^2)\)的时间复杂度完成长度为\(n\)的数组的排序。不妨假设这\(n\)个数......