2024 National Invitational of CCPC (Zhengzhou)(CCPC郑州邀请赛暨CCPC河南省赛)

news2024/11/15 19:50:29

2024 National Invitational of CCPC (Zhengzhou)

2024CCPC郑州邀请赛暨CCPC河南省赛

2024 National Invitational of CCPC (Zhengzhou)
在这里插入图片描述

B. 扫雷 1

题意:扫n轮雷,每轮开始获得一枚扫雷币,可保存,从第一轮开始,可以决定在任意轮进行任意次扫雷,但过去的轮数不能返回,第i轮需要花费 c i c_i ci枚扫雷币扫雷一次,n轮最多扫多少雷。

思路:记录一个最便宜的扫雷后缀,遇见当前后缀最便宜的就开始买。

AC code:

void solve() {
    int n; cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    r[n + 1] = INF;
    for (int i = n; i >= 1; i --) {
        r[i] =  min(r[i + 1], a[i]);
    }
    int cnt = 0, now = 0;
    for (int i = 1; i <= n; i ++) {
        now ++;
        if (a[i] == r[i]) {
            cnt += now / a[i];
            now -= (now / a[i]) * a[i];
        }
    }
    cout << cnt << endl;
}

F. 优秀字符串

题意:略;

思路:照着题意模拟即可;

AC code:

void solve() {
    int n; cin >> n;
    int cnt = 0;
    while (n --) {
        string s; cin >> s;
        if (s.size() != 5) continue;
        if (s[2] != s[4]) continue;
        bool flag = 1;
        for (int i = 0; i < 4; i ++) for (int j = i + 1; j < 4; j ++) {
            if (s[i] == s[j]) flag = 0;
        }
        if (flag) cnt ++;
    }
    cout << cnt << endl;
}

H. 随机栈

题意:给出一个空栈,还有一个操作序列,当当前操作元素不为-1时,将该元素压入栈中,否则取出一个栈中元素,取出当前栈中每个元素的概率是相同的,求最终取出元素序列为非递减的概率是多少,结果对998244353取模。

思路:模拟这个过程可以用优先队列来解决,当前栈中的元素总数为分母,当前队头的最小元素的数量即为分子,该数量可以用map来记录,计算不同分数的积并进行取模;

注意,运算过程中需要对各分数进行逆元取模运算,即分子*分母的逆元的过程不断累乘,过程中注意取模;

AC code:

int qmi(int a, int k, int p) {
    int res = 1;
    while (k) {
        if (k & 1) res = res * a % p;
        a = a * a % p;
        k >>= 1;
    } return res;
}

void solve() {
    int n; cin >> n;
    map<int, int> mp;
    priority_queue<int, vector<int>, greater<int>> q;
    int x = 1, y = 1;
    int ans = qmi(1, MOD - 2, MOD);
    for (int i = 1; i <= 2*n; i ++) {
        cin >> a[i];
    } 
    int last = -1;
    for (int i = 1; i <= 2*n; i ++) {
        if (a[i] == -1) {
            int t = q.top();
            if (last <= t) last = t;
            else {
                cout << 0 << endl;
                return;
            }
            int xx = mp[t], yy = q.size();
            int gd = gcd(xx, yy);
            //cout << xx << ' ' << yy <<' ' << gd << endl;
            ans = ((ans * xx) % MOD) * qmi(yy, MOD - 2, MOD) % MOD;
            mp[t] --;
            q.pop();
        } else {
            q.push(a[i]);
            mp[a[i]] ++;
        }
    }
    cout << ans % MOD << endl;
}

J. 排列与合数

题意:给出一个五位数字,重排后在没有前导零的情况下是否可能出现合数;

思路:预处理一下五位的合数,O1进行判断,然后DFS跑一下五位数的全排列即可;

AC code:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5+10, M = 2001;
const int INF = 0x3f3f3f3f3f, MOD = 998244353;
int T;
int n, ans;
int a[N], b[N], st[10];
bool p[N];

bool iprime(int x) {
    if (x == 1) return false;
    for (int i = 2; i <= x / i; i ++) {
        if (x % i == 0) {
            return true;
        }
    } return false;
}

void dfs(string aim, string s) {
    if (ans != -1) return;
    if (aim.size() == 5) {
        int cnt = 0, tt = 10000;
        if (aim[0] == '0') return;
        for (int i = 0; i < 5; i ++) {
            cnt += (aim[i] - '0') * tt;
            tt /= 10;
        }
        if (p[cnt]) {
            ans = cnt;
            return;
        }
        return;
    }
    for (int i = 0; i < 5; i ++) {
        if (!st[i]) {
            st[i] = 1;
            aim += s[i];
            dfs(aim, s);
            aim.pop_back();
            st[i] = 0; 
        }
    }
}

void solve() {
    string s; cin >> s;
    for (int i = 0; i < 5; i ++) st[i] = 0;
    string ss = "";
    ans = -1;
    dfs(ss, s);
    cout << ans << endl;
}

signed main() {
    fast();
    
    T = 1;
    for (int i = 1; i < 100000; i ++) {
        if (iprime(i)) p[i] = 1;
        else p[i] = 0;
    }
    cin >> T;
    while (T --) {
        solve();
    }
    return 0;
}

K. 树上问题

题意:n个结点的无根树,每个结点有一个正权值,美丽节点的定义为,以当前节点为根时,除根节点外的所有节点,其点权不小于父节点的一半,计算有多少美丽节点。

思路:

首先初始就满足x * 2 >= y的节点y一定可以为x的父节点,即有一条有向边,若两个点互相可为父节点,则这两点可以由并查集记录为同一点在图中存在;

现在统计每个点当前可能的父节点,并根据上述情况合并到同一并查集中,记录每个连通块的大小;

然后通过DFS进行记录各点的出度,出度为0的点即为可能的根节点,注意在统计过程中进行标记防止重复统计;

注意,如果存在某一点的出度大于1,则该连通图必然不可能存在美丽节点。

AC code:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5+10, M = 2001;
const int INF = 0x3f3f3f3f3f, MOD = 998244353;
int T;
int n;
int a[N], f[N], d[N];
vector<int> g[N];
map<int, int> mp, pos;

int find(int x) {
    if (f[x] != x) f[x] = find(f[x]);
    return f[x];
}

void dfs(int u, int v) {
    for (auto t : g[u]) {
        if (t == v) continue;
        dfs(t, u);
        int fu = find(u), ft = find(t);
        if (fu == ft) continue;
        if (a[t] * 2 >= a[u] && a[u] * 2 >= a[t]) continue;
        else if (a[t] * 2 >= a[u]) d[ft] ++;
        else if (a[u] * 2 >= a[t]) d[fu] ++;
        else d[ft] ++, d[fu] ++;
    }
}
 
void solve() {
    cin >> n;
    mp.clear();
    pos.clear();
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
        f[i] = i;
        d[i] = 0;
        g[i].clear();
    }
    for (int i = 1; i < n; i ++) {
        int u, v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
        int fu = find(u), fv = find(v);
        if (a[u] * 2 >= a[v] && a[v] * 2 >= a[u]) {
            f[f[u]] = fv;
        }
    }
    for (int i = 1; i <= n; i ++) {
        mp[find(i)] ++;
    }
    dfs(1, -1);
    int ans = 0;
    for (int i = 1; i <= n; i ++) {
        if (d[find(i)] > 1) {
            cout << 0 << endl;
            return;
        }
        if (d[find(i)] || pos[find(i)]) continue;
        pos[find(i)] ++;
        ans += mp[find(i)];
    }
    cout << ans << endl;
}

signed main() {
    fast();
    
    T = 1;
    cin >> T;
    while (T --) {
        solve();
    }
    return 0;
}

L. Toxel 与 PCPC II

题意:总共n行代码,已知m行有bug,扫描一行需要一秒,同时处理x个bug需要 x 4 x^4 x4秒,最短多少秒可以完成;

思路:dp,在更新每个点的最短debug时间时最多不会超过同时处理30个bug;

AC code:

int qmi (int a, int k) {
    int res = 1;
    while (k) {
        if (k & 1) res = res * a;
        a = a * a;
        k >>= 1;
    } return res;
}

void solve() {
    int n, m; cin >> n >> m;
    vector<int> a(m + 10), dp(m + 10, INF);
    dp[0] = 0;
    for (int i = 1; i <= m; i ++) cin >> a[i];
    for (int i = 1; i <= m; i ++) {
        for (int j = i - 1; j >= max(0LL, i - 30); j --) {
            dp[i] = min(dp[i], dp[j] + a[i] + qmi(i - j, 4));
        }
    }
    cout << dp[m] << endl;
}  

M. 有效算法

题意:给出长度为n的序列a和b,对于每个a元素进行一次操作满足|ai - x| <= k * bi的任意整数x,求出最小的非负整数k,满足至少存在一种方法的操作后所有a元素相等

思路:二分即可,对于check函数每次x都会有一个左右边界,不断缩小左右边界,x只要出现在该范围内均符合条件,若出现r>l边界的情况则直接返回false,注意二分边界,最多开到1e9,不然会炸(血的教训)。

AC code:

bool check (int k) {
    int l = -INF, r = INF;
    for (int i = 1; i <= n; i ++) {
        int now = k * b[i];
        int ll = a[i] - now, rr = a[i] + now;
        l = max(l, ll);
        r = min(r, rr);
        if (l > r) return false;
    }
    return true;
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) cin >> b[i];
    int l = 0, r = 1e9;
    while (l < r) {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << r << endl;
}

PS:有没有佬有A的写法QAQ

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

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

相关文章

如何管理多个版本的Node.js

我们如何在本地管理多个版本的Node.js&#xff0c;有没有那种不需要重新安装软件再修改配置文件和环境变量的方法&#xff1f;经过我的查找&#xff0c;还真有这种方式&#xff0c;那就是nvm&#xff08;Node Version Manager&#xff09;。 下面我就给大家介绍下NVM的使用 1…

MSR810-LM快速配置通过LTE模块上网

正文共&#xff1a;1111 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前买了一个无线版本的MSR810-W&#xff08;淘了一台二手的H3C企业路由器&#xff0c;就用它来打开网络世界的大门&#xff09;&#xff0c;并整理了一份快速配置&#xff08;脚本案例来了&#x…

AI大事记(持续更新)

文章目录 前言 一、人工智能AI 1.基本概念 2.相关领域 2.1基础设施 2.2大模型 2.3大模型应用 二、大事记 2024年 2024-05-14 GPT-4o发布 2024-02-15 Sora发布 2023年 2023-03-14 GPT-4.0发布 2022年 2022-11-30 ChatGPT发布 总结 前言 2022年11月30日openai的…

【数据结构】栈的实现(链式栈)

文章目录 栈的实现&#xff08;链式栈&#xff09;栈的定义初始化栈进栈判断是否为空栈出栈销毁栈获取栈顶元素获取栈的长度栈的打印 完整代码&#xff08;包括测试代码&#xff09;Stack.hStack.ctest.c 栈的实现&#xff08;链式栈&#xff09; 首先新建一个工程&#xff1a…

基于HTTP GET方式获取网络时间的实现

上一节&#xff0c;我们介绍了基于NTP服务器获取网络时间的例子&#xff0c;但在有些情况下&#xff0c;比如我最近在使用RNDIS协议通过4G模块上网&#xff0c;这个协议不支持UDP协议&#xff0c;所以就用不了NTP服务器。或者有时候我们需要有更多的网络时间获取方式&#xff0…

Transformers实战01-开箱即用的 pipelines

文章目录 简介安装pipelines图片转文本文本生成情感分析零训练样本分类遮盖词填充命名实体识别自动问答自动摘要 pipeline 背后做了什么&#xff1f;使用分词器进行预处理将预处理好的输入送入模型对模型输出进行后处理 简介 Transformers 是由 Hugging Face 开发的一个 NLP 包…

群辉部署小雅alist实现视听盛会

最近群辉搭建起来了&#xff0c;开始整蛊影视库&#xff0c;之前搞过nastool。这次折腾下小雅alist。 1.下载并安装 直接在群辉的docker里面下载映像 主要映射下端口和文件夹 #token mytoken.txt 获取地址&#xff1a;https://alist.nn.ci/zh/guide/drivers/aliyundriv…

牛客网刷题 | BC84 牛牛学数列2

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 这次牛牛又换了个数…

《控制系统实验与综合设计》综合四至六(含程序和题目)

1.电机模型辨识实验 1.1 实验目的 &#xff08;1&#xff09;掌握一阶系统阶跃响应的特点&#xff0c;通过实验加深对直流电解模型的理解&#xff1b; &#xff08;2&#xff09;掌握系统建模过程中参数的整定&#xff0c;体会参数变化对系统的影响&#xff1b; &#xff0…

SpringBoot解决CORS跨域——WebMvcConfigurationSupport

前端请求后端报错了。 状态码&#xff1a;403 返回错误&#xff1a;Invalid coRs request 增加配置类WebMvcConfig Configuration public class WebMvcConfig extends WebMvcConfigurationSupport {Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许跨域…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数&#xff08;用 async 声明的函数&#xff09; 异步函数的定义 使用async关键字声明的函数&#xff0c;称之为异步函数。在普通函数前面加上 async 关键字&#xff0c;就成了异步函数。语法举例&#xff1a; // 写法1&#xff1a;函数声明的写法async function foo1(…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 技术&#xff1a;C语言、单片机等 摘要&#xff1a; 此设计可分为三个主要部分。此中的温度和湿度的检测功能&#xff0c;通过操纵单总线型温湿度传感器DHT11以数字形式显示&#xff0c;实现了切确测得温湿度的功能…

Python | Leetcode Python题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution:def grayCode(self, n: int) -> List[int]:ans [0] * (1 << n)for i in range(1 << n):ans[i] (i >> 1) ^ ireturn ans

uniapp 实现下拉刷新 下滑更新

效果图 在app或者小程序中向下滑动 会出现刷新数据 ,而上拉到底 需要更新数据 功能实现 主要俩种方式 依赖生命周期 在page.json中开启 page.json "style" : {"navigationBarTitleText" : "小小练习","backgroundTextStyle": &qu…

Linux环境部署与命令技巧

Linux环境部署与命令技巧 安装Java 首先确保已经安装了Java。通过运行以下命令检查Java是否已安装&#xff1a; java -version # 查看Java版本如果未安装Java&#xff0c;可以使用以下命令安装OpenJDK&#xff1a; sudo yum install java-11-openjdk # 安装OpenJDK 11创建一个…

用Swagger(工具Knife4j )代替postman来进行构建、测试和调试 API

什么是Swagger&#xff1f; Swagger 是一个用于设计、构建和文档化 RESTful Web 服务的开源框架。它允许开发者设计 API&#xff0c;然后生成对应的 API 文档&#xff0c;提供给团队成员或者第三方开发者查阅。Swagger 的核心是 OpenAPI 规范&#xff08;之前称为 Swagger 规范…

来学习线程啦

线程的相关概念 程序 简单点说&#xff1a;程序就是我们写的代码&#xff1b;也可以理解为&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合 进程 进程是指运行中的程序。 比如&#xff1a;我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系…

Centos 6.10 安装oracle10.2.0.1

由于阿里云机房要下架旧服务器&#xff0c;单位未购买整机迁移服务&#xff0c;且业务较老不兼容Oracle11g&#xff0c;所以新购买一台新服务器进行安装Oracle10.2.0.1 &#xff0c;后续再将数据迁移到新服务器上。 对外ip 内部ip 数据库版本 操作系统版本 实例名 源库 1…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的序列&#xff0c;每次比较相邻…