The 2022 ICPC Asia Xian Regional Contest

news2024/10/7 8:25:47

题目顺序大致按照难度排序。

F. Hotel

现在酒店中有单人间和双人间,价格分别是c1,c2,现在有n个队,每队三个人,性别分别用字母表示,当两个人性别相同且在同一个队时,他们可以住在双人间中。求最少需要多少钱使得n个队住下。

思路:直接模拟。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e5 + 5;
ll n, c1, c2;
std::string s;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> n >> c1 >> c2;
    ll ans = 0;
    for(int i = 1; i <= n; i ++) {
        std::cin >> s;
        std::sort(s.begin(), s.end());
        if(s[0] == s[1] || s[1] == s[2]) {
            ans += std::min(c1, c2) + std::min(c1 * 2, c2);  
        }
        else
            ans += std::min(c1, c2) * 3;
    }
    std::cout << ans << '\n';
    return 0;
}

 J. Strange Sum

给出n个数的序列a,可以从中选择一些数字,但是如果选择了a[i],则要满足序列中所有长度为i的子串中最多有两个数被选到,现在求选择的数和最大是多少,注意,可以不选任何数。

思路:假设我们选择了三个数a[i]、a[j]和a[k],且k>j>i,那么在1~k区间内就会有三个数,不满足条件,可以得到最多选择两个数。排序贪心选择即可。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e5 + 5;
int n;
int a[N];

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> n;
    for(int i = 1; i <= n; i ++) {
        std::cin >> a[i];
    }
    std::sort(a + 1, a + 1 + n, std::greater<int>());
    std::cout << std::max({0, a[1], a[1] + a[2]}) << '\n';
    return 0;
}

C. Clone Ranran

有个人要准备c道题,他可以进行如下两种操作:花费a分钟克隆一个自己;花费b分钟准备一道题目。问准备c道题最少需要多长时间。

思路:最优选择一定是先尽可能快的克隆自己,然后最后一起花b分钟准备一道题,得到的计算式是a\times x + \left \lceil \frac{c}{2^{x}} \right \rceil \times b,x是克隆的次数。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e5 + 5;
int t;
ll a, b, c;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> t;
    while(t --) {
        std::cin >> a >> b >> c;
        ll ans = 1e18;
        for(int i = 0; i <= 30; i ++) {
            ll res = 1 << i;
            res = (ll)(ceil(c * 1.0 / res));
            ans = std::min(ans, a * i + res * b);
        }
        std::cout << ans << '\n';
    }
    return 0;
}

 G. Perfect Word

给出n个字符串,对于一个字符串,若它的所有子串都出现在了这n个字符串中,则称这个字符串是good的,则最大的good串的长度是多少。

思路:可以从数据范围考虑起。若一个字符串能成为good字符串,且长度为x,那么它的x * (x + 1) / 2个子串都要出现,这样想good串长度最多是根下1e5级别,我们大约可以用350代替。然后考虑暴力,如果所有的串长度都是350,那一共最多有1e5 / 350个字符串,完全可以暴力,这样循环的时间复杂度是1e7级别,可以过。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e5 + 5;
int n;
std::string s[N];
std::unordered_map<std::string, int> mp;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> n;
    for(int i = 1; i <= n; i ++) {
        std::cin >> s[i];
        mp[s[i]] ++;
    }
    int ans = 0;
    for(int i = 1; i <= n; i ++) {
        int len = s[i].length();
        bool flag = true;
        for(int j = 0; j < len; j ++) {
            for(int k = 1; k <= len; k ++) {
                if(j + k - 1 >= len) continue;
                std::string ss = s[i].substr(j, k);
                if(!mp[ss]) {
                    flag = false;
                    break;
                }
            }
            if(!flag) break;
        }
        if(flag)
            ans = std::max(ans, (int)s[i].length());
    }
    std::cout << ans << '\n';
    return 0;
}

E. Find Maximum

 给出函数f(x),回答t次询问,每次给出l和r,求区间[l, r]之间最大的f(x)是多少。

思路:f(x)的值可以联想到三进制,不过它是x的三进制加位数的和,那就直接贪心,使得三进制下每一位2的数量尽可能多。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e5 + 5;
int t;
ll f[N];

std::vector<int> get3(ll x) {
    std::vector<int> vec;
    while(x) {
        int num = x % 3;
        vec.push_back(num);
        x /= 3;
    }
    reverse(vec.begin(), vec.end());
    return vec;
}

ll getans(ll x) {
    if(!x) return 1;
    else if(x % 3 == 0) return getans(x / 3) + 1;
    else return getans(x - 1) + 1;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> t;
    while(t --) {
        ll l, r;
        std::cin >> l >> r;
        std::vector<int> R = get3(r);
        ll ans = std::max(getans(l), getans(r));
        int n = R.size();
        for(int i = 0; i < n; i ++) {
            ll res = 0;
            if(R[i] == 0) continue;
            for(int j = 0; j < i; j ++) {
                res = res * 3 + R[j];
            }
            res = res * 3 + R[i] - 1;
            for(int j = i + 1; j < n; j ++) {
                res = res * 3 + 2;
            }
            if(res >= l)
                ans = std::max(ans, getans(res));
        }
        std::cout << ans << '\n';
    }
    return 0;
}

 L. Tree

定义节点u的subtree(u)是以u为根的子树中所有节点的集合,现在称集合S是good的当且仅当它满足至少一个条件:1、对于S中所有不同的u和v,满足u是vsubtree中的一点或反之;2、对于S中所有不同的u和v,他们两个没有父子树关系。现给出一棵树,问可以划分的good集合数最小是多少。

思路:官方题解:

 解释一下概念:链和反链是在简单有向无环图中定义的,在一条路径中出现的点,是在一条链上;不在一条路径上出现的点,即无法相互到达的点,是在一条反链上,形象的来说,在题目给定的树中,可以定义这棵树是以根节点为起始点的有向图,那么链就是在一条路径中的点,反链连接的就是若干叶子结点(也不一定都是叶子结点)。 

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
const int N = 1e6 + 5;
int t, n;
int d[N], cnt[N], dep[N];
std::vector<int> vec[N];

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    std::cin >> t;
    while(t --) {
        std::cin >> n;
        for(int i = 1; i <= n; i ++) {
            vec[i].clear();
            d[i] = cnt[i] = dep[i] = 0;
        }
        for(int i = 2; i <= n; i ++) {
            int u;
            std::cin >> u;
            d[u] ++;
            vec[i].push_back(u);
        }
        std::queue<int> q;
        for(int i = 1; i <= n; i ++) {
            if(!d[i]) {
                q.push(i);
                dep[i] = 1;
            }
        }
        while(!q.empty()) {
            int now = q.front();
            q.pop();
            for(auto u : vec[now]) {
                dep[u] = dep[now] + 1;
                d[u] --;
                if(!d[u]) {
                    q.push(u);
                }
            }
        }
        for(int i = 1; i <= n; i ++) {
            cnt[dep[i]] ++;
        }
        int ans = 2e9;
        for(int i = 1; i <= n; i ++) {
            ans = std::min(ans, cnt[i] + i - 1);
        }
        std::cout << ans << '\n';
    }    
    return 0;
}

 气,感觉铜牌题看了题解也不难,但是赛时想不到www

B是网络流?没学,爬了

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

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

相关文章

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo写在前面环境配置创建虚拟环境安装库项目运行写在前面 相信很多朋友跟我一样在github等平台上偷代码 (读书人的事怎么能叫偷呢) 的时候会发现伟大且无私的作者虽然开源了代码但是readme文件该写的没写&#x…

2023TYUT移动应用软件开发程序设计和填空

目录 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件 程序设计2&#xff1a;根据要求,补充Activity.java文件 程序填空 说明&#xff1a; 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件…

【C++初阶】第十篇:list模拟实现

文章目录一、list的模拟实现三个类及其成员函数接口总览结点类的模拟实现迭代器类的模拟实现迭代器类的模板参数说明迭代器operator->的重载迭代器模拟实现代码list的模拟实现无参构造函数带参构造拷贝构造函数赋值运算符重载函数析构函数begin和endinserteraselist的迭代器…

WordPress添加阿里云OSS对象云储存配置教程

背景&#xff1a;随着页面文章增多&#xff0c;内置图片存储拖连网站响应速度&#xff0c;这里对我来说主要是想提升速度 目的&#xff1a;使用第三方云存储作为图片外存储(图床)&#xff0c;这样处理可以为服务器节省很多磁盘空间&#xff0c;在网站搬家的时候减少文件迁移的工…

【数据结构】堆(笔记总结)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

MySQL--数据库基础--0406

目录 1.什么是数据库&#xff1f; 2. 基本使用 2.1 连接服务器 2.2 数据库的操作在Linux中的体现 2.3 使用案例 3.服务器&#xff0c;数据库&#xff0c;表关系 4.数据逻辑存储 5.SQL的分类 6.存储引擎 1.什么是数据库&#xff1f; 数据库和文件 文件或者数据库&…

OK-MX93开发板-实现Web页面无线点灯

上篇文章&#xff1a;i.MX9352——介绍一款多核异构开发板&#xff0c;介绍了OK-MX9352开发板的基础硬件功能。 本篇来使用OK-MX9352开发板&#xff0c;通过Web界面进行点灯测试&#xff0c;最终的效果如下&#xff1a; 在进行代码编写之前&#xff0c;先在Ubuntu虚拟机上把这…

对比损失Contrastive Loss(CVPR 2006)原理解析

paper&#xff1a;http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf 本文提出的对比损失contrastive loss被广泛应用于自监督模型中&#xff0c;但最初对比损失是作为一个特征降维方法而提出的。 摘要 降维是学习一种映射关系&#xff0c;通过这种映射关…

day10 线程池及gdb调试多线程

目录 线程池的概念 概念&#xff1a; 必要性&#xff1a; 线程池的基本结构&#xff1a; 线程池的实现 完整代码 线程的GDB调试 线程池的概念 概念&#xff1a; 通俗的讲就是一个线程的池子&#xff0c;可以循环的完成任务的一组线程集合&#xff1b; 必要性&#xff…

【软件工程】为什么要选择软件工程专业?

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录前言软件工程&#x1f4bb;&#x1f4bb;&#x1f4bb;就业岗位&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;就业前景&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️工作环…

趣谈之什么是 API 货币化?

本文介绍了 API 货币化和 APISIX 实现 API 货币化方法。 作者刘维&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Contributor 原文链接 什么是 API 货币化 想象你开发并部署了一个服务&#xff0c;能够搜集你所在城市所有超市的打折和优惠信息&#xff0c;其他的…

C生万物 | 校招热门考点 —— 结构体内存对齐

文章目录一、前言结构体偏移量计算&#xff1a;offsetof二、规则介绍例题的分解与细说三、习题演练1、练习①2、练习②四、为什么存在内存对齐?1、平台原因(移植原因)2、性能原因五、如何修改默认对齐数六、实战演练✍一道百度笔试题&#xff1a; offsetof 宏的实现&#x1f4…

深度学习基础篇之深度神经网络(DNN)

神经网络不应该看做是一个算法&#xff0c;应该看做是一个特征挖掘方法。在实际的业界发展过程中&#xff0c;数据的作用往往大于模型&#xff0c;当我们把数据的隐藏特征提取出来之后&#xff0c;用很简单的模型也能预测的很好。 神经网络模型由生物神经中得到启发。在生物神…

【Linux】Makefile的简述

目录 前言&#xff1a; 一、Makefile的规则 二、Makefile的函数语法 &#xff08;1&#xff09;通配符pattern ​&#xff08;2&#xff09; 删除clean ​&#xff08;3&#xff09; 立即变量、延时变量 &#xff08;4&#xff09; Makefile常用函数 3-1.Makefile要达到…

第11章_常用类和基础API

第11章_常用类和基础API 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串…

vue之--使用TypeScript

搭配 TypeScript 使用 Vue​ 像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。…

2023年美赛春季赛 Y题详细思路

由于今年各种各样的原因&#xff0c;导致美赛头一次&#xff0c;据说也将是最后一次&#xff0c;临时调整&#xff0c;加设春季赛。这对于急需建模奖项的大家来说是一个很好的机会。无论怎样的原因&#xff0c;今年美赛我们可能有所遗憾。但&#xff0c;春季赛也许就是弥补遗憾…

HTML4.1表单标签

input&#xff08;登录、注册、搜索功能&#xff09; type属性值类型称号展示类型text文本框placeholder占位符password密码框placeholder占位符radio单选框name checked&#xff08;默认选中&#xff09;同类型单选checkbox复选框 checked file 文件选择multiple多文件选择s…

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测分类效果模型描述程序设计参考资料分类效果 模型描述 Matlab实现CNN-GRU-Attention多变量分类预测 1.data为数据集&#xff0c;格式为excel&#xff0c;12个输…

集合-LinkedList

LinkedList LinkedList的概述 LinkedList的底层使用双向链表实现。 链表是一种线性数据结构&#xff0c;其中每个元素都是一个单独的对象&#xff0c;包含一个指向列表中下一个节点的引用。 它可以用于实现各种抽象数据类型&#xff0c;例如列表、堆栈、队列等。 LinkedLis…