The 13th Shandong ICPC Provincial Collegiate Programming Contest

news2025/1/20 5:06:22

The 13th Shandong ICPC Provincial Collegiate Programming Contest

The 13th Shandong ICPC Provincial Collegiate Programming Contest
在这里插入图片描述

A. Orders

题意:有n个订单, 每日可生产k个产品,每个订单给出交付日和交付数量,是否能完成所有订单。

思路:按照交付日期进行排序,然后记录当前累计的产品数,能交付就交付,否则直接输出NO。

AC code:

void solve() {
    int n, k; cin >> n >> k;
    vector<PII> q(n);
    for (int i = 0; i < n; i ++) {
        cin >> q[i].first >> q[i].second;
    }
    sort(q.begin(), q.end());
    int now = 0, last = 0;
    for (int i = 0; i < n; i ++) {
        now += (q[i].first - last) * k;
        if (now >= q[i].second) now -= q[i].second, last = q[i].first;
        else {
            cout << "No" << endl;
            return;
        }
    }
    cout << "Yes" << endl;
}

B. Building Company

题意:

当前公司有g种员工,给出每种员工的编号以及数量;

现在需要承接n个项目,每种项目给出所需的m种员工编号以及所需数量;

如果当前公司员工数大于等于所需的各种员工数,则完成该项目,然后会有k种员工及相应数量加入公司;

每个项目最多完成一次,现在计算最多可以完成多少项目。

思路:

  • 首先记录当前公司中每种员工的数量;
  • 对于每项工程,记录第i项工程缺失的员工种类数,如果缺失数为0即当前可以完成该项目则存入一个队列中;
  • 对于每种员工,若第i个项目缺少j种员工,则在第j种员工后记录该项目;
  • 然后遍历当前队列,每次取出的即为当前可以完成的项目,然后遍历完成该项目可以获得的j种员工,再对缺少该种员工的项目进行遍历,若有了新增员工的当前项目可以满足,则项目缺失数–,项目缺失数为0则压入队列;
  • 存取每种员工所需公司时可以用小根堆的优先队列来存取,当出现大于当前员工数时直接break;

AC code:

void solve() {
    unordered_map<int, int> ump;
    int g; cin >> g;
    for (int i = 0; i < g; i ++) {
        int t, u; cin >> t >> u;
        ump[t] += u;
    }
    int n; cin >> n;
    int cnt = 0;
    queue<int> qq; //存完成的
    map<int, int> res; //每个项目差的
    map<int, vector<PII>> b;
    map<int, priority_queue<PII, vector<PII>, greater<PII>>> mp;
    for (int i = 0; i < n; i ++) {
        int tt = 0, k1, k2;
        cin >> k1;
        while (k1 --) {
            int u, v; cin >> u >> v;
            if (ump[u] < v) {
                tt ++;
                mp[u].push({v, i});
            } //不够
        }
        cin >> k2;
        while (k2 --) {
            int u, v; cin >> u >> v;
            b[i].push_back({u, v});
        }
        if (tt == 0) qq.push(i);
        res[i] = tt;
    }
    int ans = 0;
    while (!qq.empty()) {
        auto now = qq.front();
        ans ++;
        qq.pop();
        for (auto [x, y] : b[now]) {
            ump[x] += y;
            while (!mp[x].empty()) {
                auto [nd, pp] = mp[x].top();
                if (ump[x] >= nd) {
                    res[pp] -= 1;
                    mp[x].pop();
                    if (res[pp] == 0) qq.push(pp);
                } else {
                    break;
                }
            }
        }
    }
    cout << ans << endl;
}

D. Fast and Fat

题意:跑步比赛,一队有n名队员,给出每名队员的速度以及体重;一个队员可以背着另一个队员,i背j,若j的体重小于i,则对i的速度没有影响,否则i的速度vi - (wj - wi),若i的速度为负,则i无法背j;

求整体可能的最大速度,团队最慢成员即为团队速度。

思路:

二分团队最小速度,在check函数里将速度慢的人按照重量从大到小存取,然后将符合条件的人按照速度+重量从大到小进行存取,遍历当前不符合条件的人是否都能有人能背并且整体速度符合最小速度。

AC code:

PII q[N];

struct cmp{
    bool operator() (const PII a, const PII b) {
        return a.first + a.second < b.first + b.second;
    }
};

bool check (int aim) {
    priority_queue<PII, vector<PII>, cmp> pr;
    vector<int> w;
    for (int i = 0; i < n; i ++) {
        if (q[i].first >= aim){
            pr.push(q[i]);
        } else {
            w.push_back(q[i].second);
        }
    }
    if (pr.size() == n) return true;
    if (pr.size() < w.size()) {
        return false;
    }

    sort(w.begin(), w.end(), greater<int>());
    for (auto x : w) {
        if (!pr.empty()) {
            auto [u, v] = pr.top();
            pr.pop();
            if (u + v - x >= aim) continue;
            else {
                return false;
            }
        } else {
            return false;
        }
    }
    return true;
}

void solve() {
    cin >> n;
    for (int i = 0; i < n; i ++) {
        cin >> q[i].first >> q[i].second;
    }
    sort(q, q + n);
    int l = 0, r = 2e9;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
}

E. Math Problem

题意:

给定两个正整数 n和k,你可以执行以下两种类型的运算任意多次(包括零次):

  • 选择一个满足 0<=x<k的整数 x,将n改为k*n+x 。执行一次这个操作需要花费 a 枚金币。每次选择的整数 x可以不同。
  • 将 n改为n/k 。执行此操作一次需要花费 b枚金币。

给定正整数 m ,计算将 n 变为 m的倍数所需的最少金币数。请注意, 0 是任何正整数的倍数。

思路:

  • 首先一定是先除后乘,才不会覆盖乘的操作,才能最小化使用硬币数;
  • 然后枚举除的次数以及乘的次数,当出现符合条件的值时跳出寻找下一可能的操作;
  • 枚举乘的操作时,看当前第j次乘后的值,距离最近的比当前值大于等于的m的倍数是否小于k^j,符合则说明当前操作可行;
  • 需要注意的是在计算过程中C++会爆longlong,所有我们需要int128来进行存取中间值;

AC code:

ll qmi(int a, int k) {
    ll res = 1;
    while (k) {
        if (k & 1) res = res * a;
        a = a * a;
        k >>= 1;
    }
    return res;
}
 
void solve() {
    int n, k, m, a, b; cin >> n >> k >> m >> a >> b;
    if (n % m == 0) {
        cout << 0 << endl;
        return;
    } 
    if (k == 1) {
        cout << "-1" << endl;
        return;
    }
    ll now = n;
    int ans = 2e18;
    for (int i = 0; now > 0; i ++) {
        if (i > 0) now /= k;
        ll ca = now;
        for (int j = 0; ;j ++) {
            if (j == 0) {
                if (now % m == 0) ans = min(ans, (b * i));
                continue;
            }
            ca *= k;
            ll nxt = m * ((ca / m) + (ca % m != 0));
            if ((nxt - ca) < (ll)qmi(k, j)) {
                ans = min(ans, (b * i + a * j));
                break;
            }
        }
    }
    cout << ans << endl;
}

G. Matching

题意:

给定一个长度为n的整数序列 ,我们从该序列构建一个无向图G 。更确切地说,对于所有1 <= i,j<=n ,如果 i-j=ai-aj ,则 G中会有一条连接顶点 i和 j 的无向边。这条边的权重为ai+aj 。

请为 G找出一个匹配项,使匹配项中所有边的权重之和最大,并输出这个最大值。

回想一下,无向图的匹配意味着我们从图中选择一些边,使得任意两条边都没有共同的顶点。具体来说,不选择任何边也是匹配。

思路:

  • 首先变换一下式子i - ai = j - a[j];
  • 然后我们用优先队列存取所有点-权值相等的点,对于每个可以匹配的点取出最大的两个加入到总权值中即为所求;

AC code:

void solve() {
    int n; cin >> n;
    map<int, priority_queue<int>> mp;
    for (int i = 1; i <= n; i ++) {
        int x; cin >> x;
        mp[i - x].push(x);
    }
    int cnt = 0;
    for (auto [x, y] : mp) {
        while (mp[x].size() > 1) {
            auto a = mp[x].top(); mp[x].pop();
            auto b = mp[x].top(); mp[x].pop();
            if (a + b > 0) cnt += a + b;
        }
    }
    cout << cnt << endl;
}

I.Three Dice

题意:略;

思路:枚举即可;

AC code:

void solve() {
    int a, b; cin >> a >> b;
    for (int x = 1; x <= 6; x ++) {
        for (int y = 1; y <= 6; y ++) {
            for (int z = 1; z <= 6; z ++) {
                int rd = 0, bk = 0;
                if (x == 1 || x == 4) rd += x;
                else bk += x;
                if (y == 1 || y == 4) rd += y;
                else bk += y;
                if (z == 1 || z == 4) rd += z;
                else bk += z;
                if (rd == a && bk == b) {
                    cout << "Yes" << endl;
                    return;
                }
            }
        }
    } cout << "No" << endl;
}

L. Puzzle: Sashigane

题意:在n*n的白色正方形矩阵中,有一个黑色方块,现在需要将除了黑色方块外的所有白色方块用L形覆盖;

思路:围绕黑色方块向外拓即可,n-1次内必成;

AC code:

void solve() {
    int n, x, y; cin >> n >> x >> y;
    cout << "Yes" << endl;
    cout << n - 1 << endl;
    int len = 1, t = 1;
    int lx = x, ly = y, rx = x, ry = y;
    for (int i = 1; i < n; i ++) {
        if (lx > 1 && ly > 1) {
            lx --, ly --;
            cout << lx << ' ' << ly << ' ' << len << ' ' << len << endl;
        } else if (rx < n && ry < n) {
            rx ++, ry ++;
            cout << rx << ' ' << ry << ' ' << -len << ' ' << -len << endl;
        } else if (lx == 1 && ry == n) {
            cout << rx + t << ' ' << ly - t << ' ' << -len << ' ' << len << endl;
            t ++;
        } else if (rx == n && ly == 1) {
            cout << lx - t << ' ' << ry + t << ' ' << len << ' ' << -len << endl;
            t ++;
        }
        len ++;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练 2024.5.16(补 2024.5.14)

题目&#xff1b; 我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr…

泛微E9开发 自动获取日期

选择开始日期&#xff0c;自动获取指定天数后的结束日期 1、功能背景2、展示效果3、实现方法 1、功能背景 用户选择开始日期&#xff0c;系统自动带出结束日期&#xff0c;如需要带出6天后的结束日期&#xff0c;下图所示&#xff0c;5月14日到5月20日是一个周期&#xff0c;用…

Linux-centos下安装ffmpeg的详细教程

源安装 第一种方式&#xff1a; . 首先需要安装yum源&#xff1a; 这个源安装的ffmpeg版本是3.4 yum install epel-release yum install -y https://mirrors.ustc.edu.cn/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm然后可以安装ffmpeg yum install -y ffmpeg ff…

电阻式传感器

电阻式传感器是一种将非电学量&#xff08;如温度、压力、位移等&#xff09;转换为电阻变化的传感器。它大致分为电阻应变式传感器、压阻式传感器和变阻式传感器三类。 电阻式传感器的优点包括结构简单、成本低廉、稳定性好&#xff0c;适用于多种环境。但它们也有局限性&…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

VMware虚拟机-安装程序无法自动安装virtual machine......_windows server 2008 R2

系统版本&#xff1a;windows server 2008 R2 问题-安装程序无法自动安装virtual machine… 在使用虚拟机安装windows server 2008 R2系统中&#xff0c;安装VMware Tools工具安祖啊寄给你失败&#xff0c;提示安装程序无法自动安装virtual machine…&#xff0c;必须手动安装…

lazada、shopee新店铺如何快速出单?自养号补单测评实战操作指南

作为一家Lazada、虾皮新店铺&#xff0c;要快速出单&#xff0c;需要采取一些策略和措施。以下是一些可以考虑的方法&#xff1a; 一、优化产品信息 确保您的产品信息完整、准确、清晰&#xff0c;并且可以吸引潜在客户。这包括商品标题、描述、图片、价格等。 二、优化店铺…

其他自动化工程师都在偷偷学习AI技术,你再不学就落后了!一篇文章教会你使用AI!

其他自动化工程师都在偷偷学习AI技术&#xff0c;你再不学就落后了&#xff01;一篇文章教会你使用AI&#xff01; 哈喽&#xff0c;大家好&#xff0c;我是小叔。了解小叔的朋友都清楚&#xff0c;我从来都不是标题党&#xff0c;我只会用美女图片来吸引你们&#x1f602;&am…

如何管理研发人员

在日益激烈的市场竞争中&#xff0c;企业的核心竞争力往往取决于其技术创新能力和研发实力。然而&#xff0c;随着企业研发的深入和技术的积累&#xff0c;研发人员泄密的风险也愈发严重。如何防止研发人员泄密&#xff0c;已经成为企业面临的重要问题。本文将从加强员工保密意…

前端简史之崛起:Router迁鼎

引 &#x1f4a1; Ajax 的出现&#xff0c;带来了 jQuery 时代&#xff1b;Node技术的发展&#xff0c;带来了前端工程化进阶&#xff1b;如果说前面二者是带来技术的革命&#xff0c;那么前端路由方案的多样化则带来了用户体验的升级以及项目管理的优化。 课程简介 《前端简史…

AI for Good | 我们用“AI”保护地球

4月&#xff0c;草长莺飞的春夏之交&#xff0c;我们将迎来第55个世界地球日 (The World Earth Day)。在这个不断变暖的星球上&#xff0c;我们面临着一个巨大的挑战&#xff1a;气候变化。随着极端天气事件的频发&#xff0c;如何汇聚社会各界的共同努力&#xff0c;找到创新的…

【网站项目】SpringBoot379儿童疫苗接种管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

ubuntu虚拟机的 网卡不见了?

通过 ifconfig 命令查找不到自己的虚拟机上网网卡了,虚拟机的上网网卡名字是ens33 发现只有一个本地回环地址 执行如下两条指令可恢复网卡 sudo dhclient ens33#获取ip sudo ifconfig ens33#查看ip 再次通过ifconfig查看网卡信息

对话YashanDB CTO陈志标:如何推动国产数据库长远发展

深圳计算科学研究院&#xff08;以下简称“深算院”&#xff09;是深圳市人民政府2018年11月批准建设的“十大基础研究机构”之一&#xff0c;由深圳市科技创新委员会主管、深圳大学举办、深圳市龙华区人民政府共建的二类事业法人单位。 崖山数据库系统YashanDB是深算院完全自主…

券商龙头借助 PowerAgent 实现大模型落地成本与效率平衡

2022 年 ChatGPT 的诞生被看作是 AI 大模型技术的“iPhone 时刻”&#xff0c;也象征着 AI 普惠时代的真正到来。大模型持续引领全球 AI 大模型技术突飞猛进&#xff0c;特别是中国的 AI 市场。 2023 年&#xff0c;我国 AI 领域“百模大战”的硝烟还未完全消散&#xff0c;20…

金蝶AAS-V9.0前后端部署

前言 包含金蝶AAS9.0部署&#xff0c;前端部署&#xff0c;后端部署。 金蝶AAS9.0部署 1. 下载金蝶AAS9.0安装包上传至服务器&#xff1b; 2. 解压安装包&#xff1b; unzip -d /opt/AAS-V9.0 AAS-V9.0.zip3. 配置JAVA路径&#xff1b; echo $JAVA_HOME vim /opt/AAS-9.0…

二三维战场仿真系统

收费工具&#xff0c;白嫖党勿扰 收费金额1万元 1 概述 给某个公司做了一个战场仿真系统&#xff0c;该公司给了5W的辛苦费。现在把相关功能部分提取出来&#xff0c;给需要的同学。 2 功能说明 战场仿真系统&#xff0c;分为三个部分&#xff1a; 服务器&#xff0c;用来发…

太平洋产险海南分公司提醒您:高温来袭!新能源车该如何正确充电?

据不完全统计 近三年来 7-8月一直是电动汽车烧车事故的高发期 毕竟夏季的高温影响着动力电池的状态新能源汽车为什么会自燃&#xff1f; 小保替你们找到了央视的官方回答&#xff01; 原来 新能源汽车比传统燃油车多了一套电池系统 电解液为可燃物 当热量聚集达到燃点却没…

第三十二天 | 46.全排列 47.全排列||

终于进入排列&#xff01;&#xff08;之前都是组合&#xff09; 排列和组合的区别&#xff1a;在数学上的区别都懂&#xff0c;主要是看在代码实现上有什么区别 题目&#xff1a;46.全排列 树型结构比较简单 用used标记某一元素是否使用过。在组合问题中&#xff0c;其实是…

【代码随想录】面试常考题目类型之贪心1

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 本质 局部最优推出全局最优 验证 验证可不可以用贪心算法最好用的策略就是举反例&#xff0c;想不到反例就试贪心 分发饼干 455. 分发饼干 - 力扣&#xff08;…