CF构造题1600-1800(1)
D. Same Count One(Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!))
题意
给定 \(n\) 个长度为 \(m\) 的 01 序列,每次操作可以选择两个序列a1
, a2
,并选择一个\(pos\), std::swap(a1[pos], a2[pos])
, 求是每个序列中的 \(1\) 的个数都相等所需的最小操作数。
思路
可以发现 (\(1\) 的总数 ) \(\bmod \ n \neq 0\) 时, 是无解的。
令 \(avg =\) (\(1\) 的总数 ) \(/ n\), 我们可以把这 \(n\) 个序列分为两类,严格小于 \(avg\) 的 和严格大于 \(avg\) 的,其他的序列可以丢掉。
严格大于 \(avg\) 的序列都可以为 严格小于 \(avg\) 的序列补充 \(1\), 直到 严格大于 \(avg\) 的序列 \(1\) 的个数等于 \(avg\) 或者 严格小于 \(avg\) 的序列 \(1\) 个数等于 \(avg\)。
直接模拟即可。
实现
void solve_problem() {
int n, m;
std::cin >> n >> m;
std::vector a(n, std::vector<int>(m, 0));
int avg = 0;
for (int i = 0;i < n; i++) {
for (int j = 0; j < m; j++) {
std::cin >> a[i][j];
avg += a[i][j];
}
}
if (avg % n == 0) {
if (n == 1) {
std::cout << 0 << "\n";
return;
}
avg /= n;
std::vector<std::pair<int,int>> q1, q2;
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j < m; j++) {
cnt += a[i][j];
}
if(cnt < avg) q1.push_back({cnt, i});
else if (cnt > avg) q2.push_back({cnt, i});
}
int ans1 = 0;
std::vector<std::array<int, 3>> ans2;
for (int i = 1; i <= n; i++) {
if (q1.empty() || q2.empty()) break;
auto [c1, i1] = q1[0];
auto [c2, i2] = q2[0];
int d = avg - c1;
for (int j = 0; j < m; j++) {
if (d == 0 || c2 == avg) {
break;
}
if (a[i2][j] == 1 && a[i1][j] == 0) {
std::swap(a[i2][j], a[i1][j]);
c1++;
c2--;
d--;
ans2.push_back({i2 + 1, i1 + 1, j + 1});
ans1++;
}
}
q1[0] = {c1, i1};
q2[0] = {c2, i2};
if (c1 == avg) q1.erase(q1.begin());
if (c2 == avg) q2.erase(q2.begin());
}
std::cout << ans1 << "\n";
for (auto [x, y, z] : ans2) {
std::cout << std::max(x, y) << " " << std::min(y, x) << " " << z << "\n";
}
} else {
std::cout << -1 << "\n";
}
}
D. Watch the Videos(2022-2023 ICPC, NERC, Southern and Volga Russian Regional Contest (Online Mirror, ICPC Rules, Preferably Teams))
题意
有 \(n\) 个大小随意的视频和 \(1\) 个大小为 \(m\) 的磁盘,视频要下载到磁盘中才可以开始观看,下载第 \(i\) 个视频花费 \(a_i\) 的时间,开始下载第\(i\)个视频时,磁盘中要至少有\(a_i\)的空间才可以开始,下载完成需要花费 \(1\) 的时间观看完,看完之后视频立刻被从磁盘中删除,求看完所有视频需要的时间。(一次只能下载一个视频,观看视频的时候可以开始下载视频)
思路
最坏的答案(每次看完一个视频后才开始下载下一个视频), 计算方法为:
\]
可以发现如果在观看视频时下载视频,答案就可以 \(-1\) 。
要想使答案最小,只需要尽可能多的在观看视频时开始下载视频即可。
假设视频序列 \(a\) 从小到大排序, 那么可以找到一个最大的 \(pos (1\leq pos \leq n)\), 使得序列
\]
相邻两个数的和小于等于 \(m\)。
按照这个序列观看,有 \(pos - 1\) 个视频是在正在观看视频时开始下载的。可以使答案减少 \(pos - 1\)。
\(pos\) 是满足单调性的,因此可以二分来找到最大的 \(pos\)。
实现
void solve_problem() {
int n, m;
std::cin >> n >> m;
std::vector<int> a(n);
for (auto &x : a) {
std::cin >> x;
}
std::sort(a.begin(), a.end());
auto check = [&](int x) {
int l = 0, r = x - 1;
while (l < r) {
if (a[r] > m - a[l]) return false;
r--;
l++;
}
return true;
};
int l = 1, r = n, ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
std::cout << std::accumulate(a.begin(), a.end(), 0LL) + (n - ans + 1) << "\n";
}
D. Range = √Sum(Codeforces Round #836 (Div. 2))
题意
构造一个长度为 \(n\) 的数组 \(a_1,a_2, a_3, \dots,a_n\),使 \(a_i\) 各不相同,且 \(max(a_1,a_2, a_3, \dots,a_n) - min(a_1,a_2, a_3, \dots,a_n) = \sqrt{a_1,a_2, a_3, \dots,a_n}\) 。
思路
当 \(n\) 为偶数时, 数组为:
\]
数组可以被分成 \(\frac{n}{2}\) 组,每组的和都为 \(2n\)。
当 \(n\) 为奇数时,我们尝试 \(max(a) - max(b) = n + 1\), 因此数组的和应为 \(n^2 + 2n + 1\)。
尝试使用 \(n - 1\) 个数分为 \(\frac{n-1}{2}\) 组,每组和为 \(2(n+1)\), 组成的数组和为 \(n^2 - 1\)。
此时这 \(n - 1\) 个数为:
\]
知道了最小项,最大项也可以计算出来 \(n + \frac{n - 1}{2} + 3\)。
这时数组的和为:
\]
距离 \(n^2 + 2n + 1\) 还需要:
(n^2 + 2n + 1) - (n^2 + n + \frac{n - 1}{2} + 2) &= n - \frac{n - 1}{2} - 1\\
&=\frac{2n - n + 1 - 2}{2}\\
&=\frac{n - 1}{2}
\end{aligned}
\]
我们可以让 第 \(\frac{n - 1}{2} + 1\) 项到第 \(n - 1\) 项都 \(+1\) 来抵消掉 \(\frac{n - 1}{2}\)。
因为第 \(n - 1\) 项 \(n + \frac{n - 1}{2} + 1\) 与 第 \(n\) 项 \(n + \frac{n - 1}{2} + 3\) 相差 \(2\),所以 \(+1\) 操作不会使数组产生重复的数。
此时我们的数组已经构造完成:
\]
实现
void solve_problem() {
int n;
std::cin >> n;
if (n % 2 == 0) {
for (int i = 0; i < n/2; i++) std::cout << (n/2 + i) << " ";
for (int i = 1; i <= n/2; i++) std::cout << (n + i) << " ";
std::cout << "\n";
} else {
for (int i = 1; i <= (n - 1) / 2; i++) std::cout << (n - 1) / 2 + i + 1 << " ";
for (int i = 1; i <= (n - 1) / 2; i++) std::cout << n + i + 2 << " ";
std::cout << n + (n - 1) / 2 + 3<< "\n";
}
}
CF构造题1600-1800(1)的更多相关文章
- CF1110E Magic Stones(构造题)
这场CF怎么这么多构造题…… 题目链接:CF原网 洛谷 题目大意:给定两个长度为 $n$ 的序列 $c$ 和 $t$.每次我们可以对 $c_i(2\le i<n)$ 进行一次操作,也就是把 $c ...
- cf251.2.C (构造题的技巧)
C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...
- hdu4671 Backup Plan ——构造题
link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
- BZOJ 3097: Hash Killer I【构造题,思维题】
3097: Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 963 Solved: 36 ...
- 做了一道cf水题
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
- CDOJ 1288 旅游的Final柱 构造题
旅游的Final柱 题目连接: http://acm.uestc.edu.cn/#/problem/show/1288 Description 柱神要去打Final啦~(≧▽≦)/~啦啦啦 柱神来到了 ...
- CodeForces 297C Splitting the Uniqueness (脑补构造题)
题意 Split a unique array into two almost unique arrays. unique arrays指数组各个数均不相同,almost unique arrays指 ...
- HDU 5355 Cake (WA后AC代码,具体解析,构造题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- LeetCode题目答案及理解汇总(持续更新)
面试算法题 dfs相关 全排列 #include<bits/stdc++.h> using namespace std; const int N = 10; //用一个path数组来存储每 ...
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
项目依赖 SpringBoot 2.5.5 SpringCloud 2020.0.4 Alibaba Spring Cloud 2021.1 Mybatis Plus 3.4.0 Seata 1.4. ...
- 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes
前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...
- Angular SSR 探究
一般来说,普通的 Angular 应用是在 浏览器 中运行,在 DOM 中对页面进行渲染,并与用户进行交互.而 Angular Universal 是在 服务端 进行渲染(Server-Side Re ...
- 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解
本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...
- JVM堆内存转储
在发生内存溢出错误 java.lang.OutOfMemoryError 时, JVM自动执行堆内存转储,以方便事后进行排查和分析. JVM提供了一个命令行启动参数 HeapDumpOnOutOfMe ...
- java学习之SpringMVC
0x00前言 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet. Spring MVC 是结构最清晰的 Servlet+ ...
- 2022年Python顶级自动化特征工程框架⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...
- 嵌入式-C语言基础:二级指针
二级指针:可以理解为指向指针的指针,存放的是指针变量的地址. 下面用一级指针来保存一个指针变量的地址: #include<stdio.h> int main() { int *p1; in ...
- Flask(一)
pip install flask 依赖wsgi flask框架是基于werkzegu的wsgi实现,flask没有自己的wsgi 用户一旦请求,就会调用app.__call__方法 flask 路由 ...