Codeforces Round #674 (Div. 3) C、D 题解
C.Increase and Copy #枚举
题目链接
题意
最初你有仅包含一个数字\(1\)的数组\(a\),一次操作中可对该数组进行两类操作:
- 从数组中选择一个元素,将该元素\(+1\);
- 从数组中选择一个元素,复制该元素放到原数组末端。
你需要在尽可能少的操作次数下,使得该数组所有元素值之和不小于\(n\)(\(n\leq 1e9\)),现要你求出最少操作次数
分析
显然,操作过程中,一定是先对最初元素不断自增,直到某个值后,再复制这个元素,即先进行第一类操作再进行第二类,这样能够保证操作次数尽可能少。
那么我们应该将最初元素加到多少才复制呢?我们可以枚举该元素可以增加至\(i\),那么消耗次数为\(i-1\),那么接下来复制次数即为\(\lceil{\frac{n - i}{i}} \rceil\),故总消耗次数为\(i-1+\lceil{\frac{n - i}{i}} \rceil\)。枚举\(i\),找到\(i-1+\lceil{\frac{n - i}{i}} \rceil\)的最小值即可。另外,我们无需从\(1\)枚举到\(n\),枚举到\(\sqrt{n}\)即可。
#include <string>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int MAXN = 15;
int q, n;
int main(){
scanf("%d", &q);
while(q--){
scanf("%d", &n);
int mymin = 0x3f3f3f3f;
for(int i = 1; i * i <= n; i++){
int sum = (i - 1) + (n - i) / i + ((n - i) % i != 0);
mymin = min(mymin, sum);
}
printf("%d\n", mymin);
}
return 0;
}
由官方题解思路,因为所求最值应该在\(\sqrt{n}\)的附近,我们枚举\([\lfloor \sqrt{n}\rfloor+5, \lfloor \sqrt{n}\rfloor-5]\)找最值,就能达到\(O(1)\)复杂度了。
D. Non-zero Segments #前缀和 #哈希表
题目链接
题意
给定长为\(n\)、包含正整数、也会包含负整数、但一定不包含\(0\)的数组\(a\),你需要在这个数组中某些位置插入任意值,保证该数组任意区间值之和等于\(0\),现要你求出最少插入元素数量。
分析
设该数组前缀和\(sum_i\),我们知道,某个区间\([l, r]\)的值之和为\(0\),那么就意味着\(sum_r\)与\(sum_l\)是相等的。于是,我们便可通过哈希表去记录某个前缀和是否出现过,一旦出现过,假设从左到右遍历到\(i\),发现当前的前缀和\(sum_i\),在之前出现过,说明这一中间区间的权值之和一定为\(0\),那么按照题目要求,我们将某个值插入到\(i\)的前面,使得这一中间区间的权值之和不为0的同时,保证不会与后面区间相加为\(0\)(实际插入值无需真的确定下来),此时答案加\(1\)(当然,这只是个假想的插入操作,无需真的模拟,只需要将当前前缀和置为\(0\),从\(i\)开始重新计\(sum\)即可)。别忘了,每次迭代的过程中,要记录当前前缀和到哈希表中。另外预处理时,应将前缀和为\(0\)记录到哈希表,因为有可能相邻两元素恰好为相反数。
#include <string>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int MAXN = 2e5+5;
unordered_map<ll, int> mymap;
int main(){
int n, ans = 0;
scanf("%d", &n);
ll sum = 0, cur;
mymap[0] = 1; //考虑到相邻元素恰为相反数
for(int i = 1; i <= n; i++){
scanf("%lld", &cur);
sum += cur;
if(mymap[sum] > 0){ //发现之前出现过该前缀和
mymap.clear();
mymap[0] = 1;
sum = cur; //前缀和清零(假想cur之前插入了一个数,保证前面区间不会与后面区间相加为0)
ans++;
}
mymap[sum]++;//记录该前缀和
}
printf("%d\n", ans);
return 0;
}
Codeforces Round #674 (Div. 3) C、D 题解的更多相关文章
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #672 (Div. 2) A - C1题解
[Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...
- Codeforces Round #674 (Div. 3) F. Number of Subsequences 题解(dp)
题目链接 题目大意 给你一个长为d只包含字符'a','b','c','?' 的字符串,?可以变成a,b,c字符,假如有x个?字符,那么有\(3^x\)个字符串,求所有字符串种子序列包含多少个abc子序 ...
- Codeforces Round #614 (Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...
- Codeforces Round #610 (Div. 2) A-E简要题解
contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...
- Codeforces Round #611 (Div. 3) A-F简要题解
contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...
- Codeforces Round #499 (Div. 2) D. Rocket题解
题目: http://codeforces.com/contest/1011/problem/D This is an interactive problem. Natasha is going to ...
- Codeforces Round #499 (Div. 2) C Fly题解
题目 http://codeforces.com/contest/1011/problem/C Natasha is going to fly on a rocket to Mars and retu ...
随机推荐
- 显示器类型对美乐威NDI IP转换器延时影响测试
背景 用户在选择用网络传输视频时,传输延迟通常是他们非常关心的数据.集成商在探究如何降低视频传输延时,往往专注于网络本身和视频编码的优化,容易忽略视频解码和播出也是整个视频传输过程中非常重要的环节.本 ...
- python接口自动化测试遇到的问题及解决方案
工作中xml中的某一个字段是全网唯一,这就需要进行参数化处理.此次对这一个字段进行参数化处理引用了random模块和index()函数.代码如下: #!/usr/bin/python # -*- co ...
- Luogu P6830 [IOI2020]Connecting Supertrees
题意 好复杂,我就不写了. 题解 口胡了一下,发现我居然会 IOI 的题? 首先发现有 \(3\) 一定不合法,因为连通块里面有一个环的话 \(p_{i,j}\) 最多为 \(2\),有两个环的话就存 ...
- 学习写简单Spring源码demo
最近在研究怎么实现简单的Spring的源码,通过注解的方式来实现对bean的加载管理. 首先先来看下我的工程结构: (1)spring-common:定义了常用的枚举常量,工具类(如FileUtils ...
- 基于Django的图书推荐系统和论坛
基于Django的图书推荐系统和论坛 关注公众号"轻松学编程"回复"图书系统"获取源码 一.基本功能 登录注册页面 基于协同过滤的图书的分类,排序,搜索,打分功 ...
- MIPS学习笔记(一)
写在前面 本文是根据"MIPS Assembly Language Programming CS50 Discussion and Project Book. Daniel J. Ellar ...
- 谈谈OKHttp的几道面试题
来吧,今天说说常用的网络框架OKHttp,也是现在Android所用的原生网络框架(Android 4.4开始,HttpURLConnection的底层实现被Google改成了OkHttp),GOGO ...
- Flutter(75):Sliver组件之SliverFixedExtentList
Flutter教学目录持续更新中 Github源代码持续更新中 1.SliverFixedExtentList 可以固定Item高度的SliverList 2.SliverFixedExtentLis ...
- kali xHydra使用
简介: Hydra是一款登录爆破神器,Hydar几乎可以爆破各种协议的登录,比如windows的远程桌面.ssh.ftp.路由交换设备等等. Hydar在kali linux默认已经安装. 大概介绍一 ...
- [MIT6.006] 7. Counting Sort, Radix Sort, Lower Bounds for Sorting 基数排序,基数排序,排序下界
在前6节课讲的排序方法(冒泡排序,归并排序,选择排序,插入排序,快速排序,堆排序,二分搜索树排序和AVL排序)都是属于对比模型(Comparison Model).对比模型的特点如下: 所有输入ite ...