The 13th Shandong ICPC Provincial Collegiate Programming Contest

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 ++;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谈谈【软件测试的基础知识,基础模型】

关于软件测试的基本概念和基本模型 前言一个优秀的测试人员具备的素质关于需求测试用例软件错误(BUG)概念开发模型瀑布模型&#xff08;Waterfall Model&#xff09;螺旋模型&#xff08;Spiral Model&#xff09; 前言 首先,什么是软件测试? 通俗来讲:软件测试就是找BUG&…

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中&#xff0c;实现II&#xff08;迭代间隔&#xff09; 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代&#xff0c;这是最理想的情况&…

Java面试八股之HashSet和TreeSet有什么区别

Java中HashSet和TreeSet有什么区别 1. 底层数据结构 HashSet: 基于哈希表&#xff08;实际上是 HashMap 的内部实现&#xff09;实现。每个元素通过其 hashCode() 方法计算出哈希码&#xff0c;并通过哈希码确定其在哈希表中的位置。这种结构使得 HashSet 在插入、删除和查找…

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;其特点是只允许在同一端进行插入和删除操作&#xff0c;这一端被称为栈顶。遵循后进先出&#xff08;Last In, First Out, LIFO&#…

yarn : 无法加载文件 C:\app\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本

系统运行yarn命令报错 解决办法&#xff1a; 一、点击电脑右下角的开始&#xff0c;菜单出来后&#xff0c;直接按键盘输入powerShell搜索&#xff0c;然后右键以管理员身份运行 二、以管理员运行后&#xff0c;会出现下面命令窗口 在窗口上执行&#xff1a;set-ExecutionPoli…

羊大师分析,羊奶健康生活的营养源泉

羊大师分析&#xff0c;羊奶健康生活的营养源泉 羊奶&#xff0c;作为一种古老的饮品&#xff0c;近年来因其独特的营养价值和健康益处而备受关注。今天&#xff0c;羊大师就来探讨一下羊奶与健康之间的紧密联系。 羊奶富含蛋白质、脂肪、维生素和矿物质等多种营养成分。羊奶…

哪家PMP培训机构比较优秀?

不同的培训机构在服务、收费和师资上会有一些差异&#xff0c;但基本都差不多。老师的授课方式对学习兴趣很重要&#xff0c;价格在3000-4000左右&#xff0c;选择中间价位比较好。服务也很关键&#xff0c;有的机构提供代报名和PDU等额外服务。关于机构排名的文章可以参考&…

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…

CCF20181201——小明上学

CCF20181201——小明上学 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int r,y,g,n,k[101],t[101],sum0;cin>>r>>y>>g;cin>>n; for(int i0;i<n;i){cin>>k[i]>>t[i];if(k[i]0||k[i]1)sumt[i];…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

Xilinx RAM IP核的使用及注意事项

对于RAM IP核(Block Memory Generator核)的使用以及界面的配置介绍&#xff0c;文章RAM的使用介绍进行了较详细的说明&#xff0c;本文对RAM IP核使用中一些注意的地方加以说明。 文章目录 三种RAM的区别单端口RAM(Single-port RAM)简单双端口RAM(Simple Dual-port RAM)真双端…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

翻译《The Old New Thing》- Stupid debugger tricks: Calling functions and methods

Stupid debugger tricks: Calling functions and methods - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20070427-00/?p27083 Raymond Chen 2007年04月27日 一个比较笨的调试技巧&#xff1a;调用函数和方法 在过去&#xff0c;如果你想在…

css+html 爱心❤

效果 代码实现 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

给app引导页说goodbye吧,皮之不存,毛将焉附。

有几个原因导致大部分创业者选择不开发独立的移动应用程序&#xff08;App&#xff09;&#xff1a; 成本和资源&#xff1a;开发和维护一个独立的移动应用程序需要投入大量的时间、资金和人力资源。对于创业公司来说&#xff0c;他们可能没有足够的资源来支持这样的开发和维护…

大数据性能测试怎么做?看完这篇终于懂了!

大数据性能测试的目的 1.大数据组件的性能回归&#xff0c;在版本升级的时候&#xff0c;进行新旧版本的性能比对。 2.在新版本/新的生产环境发布之后获取性能基线&#xff0c;建立可度量的参考标准&#xff0c;为其他测试场景或者调优过程提供对比参考。 3.在众多的发行版本…

【好书推荐-第十六期】《 LangChain技术解密:构建大模型应用的全景指南》(Github 6800+示例!)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

【Flask 系统教程 6】进阶操作

Flask操作cookie 在 Flask 中操作 Cookie 是相对简单的。Cookie 是一种存储在用户计算机上的小型数据片段&#xff0c;由服务器发送到用户浏览器&#xff0c;然后在每次请求时由浏览器发送回服务器。在 Flask 中&#xff0c;你可以使用 request 对象来读取 cookie&#xff0c;…

【Maven】简介_下载安装

1.maven简介 项目管理工具项目对象模型 project object model (POM) 一个项目&#xff1a;清理、编译、测试、打包、发布、部署 1.1 为什么需要使用maven 组装机和品牌机的概念IDE &#xff08;集成开发环境&#xff09;不是万能的依赖大量的手工操作&#xff0c;编译、测试、…