「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)
题目
分析
这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- -
不过问题也在我思维江化上。思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办。为什么要这么思考,因为这样思考最符合我们的思维规律。然后从这种最笨的方法中找问题、找漏洞、找关键的变量不变量,就能转化出更好的更快的算法。
这题就是这样。最笨的方法是什么?随便从哪个点出发,按照一个方向一个一个抹平差距。可以保证,n-1次一定完成。那么哪里可以改进?0区间。0区间的时候我们可以不移动:比如说 0 0 2 -2 0 0,那么只需要移动一次就可以了。那么是不是所有的0区间都可以不考虑?不可以(自己比划一下就知道了)。因此,我们需要找到最大的0区间。那么成环的问题要不要考虑?得看算法。这个算法太神奇了,我们好好分析一下。
代码
#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int, int>;
using pii = pair<int, pi>;
template<typename T>
T read()
{
T tmp; cin>>tmp;
return tmp;
}
int main()
{
int n; ll sum=0;
cin>>n;
map<ll,int> m;
int maxinterval=0;
rep(i,1,n)
{
int tmp; cin>>tmp;
sum+=tmp;
maxinterval=max(maxinterval,++m[sum]);
}
cout<<n-maxinterval<<endl;
return 0;
}
算法分析
问题就在于m[x]到底是什么。
我们考虑这三种情况的数组:
1. 0 1 -1 0
2. 1 0 -1 0
3. 1 0 0 -1
这三种情况下m[x]的值分别是什么?
1. m[0]=3, m[1]=1
2. m[1]=2, m[0]=2
3. m[1]=3, m[-1]=1
也就是说,m[x]维护的是区间前若干个数(也就是说这些数不属于区间)的和为x的区间,这样的区间的总长度。
更直观的是这样的数组:
0 1 0 -1 0 0 0 0 1 0 -1 0
m[x]分别为:m[0]=7,m[1]=4
0 1 0 -1 0 0 0 0 2 0 -2 0
m[x]分别为:m[0]=7,m[1]=2,m[2]=2
那么为什么我们要找最大的m[x]?在下面两个例子中,我们取的并不是单个的区间,但是仍然达到了最优解。
很简单,这样的区间保证了这样一个性质:第一个数一定不是0,其他数一定是0(如果第一个数是0,那么区间可以更长)。这样一来,我们总可以保证,不属于区间的数字,最后一定可以通过操作抹到0上。这样的操作不会跨越区间(什么意思呢?比如说… x1 0 0 0 2 -1 x2 0 0 0 0 …,我们设x1代表的区间和x2代表的区间一致,那么,会不会出现这样一种情况:2和-1的操作不能在x1和x2的区间内完成,它们必须要“借”别的区间的值),因为如果跨越区间了,就会导致区间和的性质被破坏了:它总保证前面的和为x(这就意味着,在区间外必有了x->x,也就是说它们是“平”的)!因此,一定能在区间之间,完成抹0的操作。
这样,我们找到最大的m[x],问题就得以解决了。
我不知道我有没有讲明白,但是感觉自己吹了一遍明白这个算法的思路了23333另外这题我觉得还是属于暴力的,因为确实还是要穷举找最大嘛23333就是其他地方的思维量大了一些
官方题解
We have array ai and should make all numbers in it be equal to zero with minimal number of operations. Sum of all ai equals to zero.
We can divide array into parts of consecutive elements with zero sum. If part has length l we can use all pairs of neighbours in operations and make all numbers be equal to zero with l - 1 operations.
So, if we sum number of operations in each part we get ans = n - k where k is number of parts. We should maximize k to get the optimal answer.
One of the part consists of some prefix and probably some suffix. Each of other parts is subarray of a.
Let’s calculate prefix sums. Each part has zero sum so prefix sums before each part-subarray are the same.
So we can calculate f — number of occurencies of the most frequent number in prefix sums and answer will be equal to n - f.
之后补分析。
「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)的更多相关文章
- 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)
题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...
- 「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)
题意 有n" role="presentation">nn个站点,排成圆形,每站间距m" role="presentation"> ...
- 「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)
题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mi ...
- 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)
题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...
- 「暑期训练」「Brute Force」 Far Relative’s Problem (CFR343D2B)
题意 之后补 分析 我哭了,强行增加自己的思考复杂度...明明一道尬写的题- -(往区间贪心方向想了 其实完全没必要,注意到只有366天,直接穷举判断即可. 代码 #include <bits/ ...
- 「暑期训练」「基础DP」 Common Subsequence (POJ-1458)
题意与分析 很简单:求最长公共子序列. 注意子序列与子串的差别:一个不连续一个连续.一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054 状态 ...
- 「暑期训练」「基础DP」免费馅饼(HDU-1176)
题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...
- 「暑期训练」「基础DP」FATE(HDU-2159)
题意与分析 学习本题的时候遇到了一定的困难.看了题解才知道这是二重背包.本题的实质是二重完全背包.二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价:对于每种 ...
- 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)
题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...
随机推荐
- 再回首数据结构—AVL树(一)
前面所讲的二叉搜索树有个比较严重致命的问题就是极端情况下当数据以排序好的顺序创建搜索树此时二叉搜索树将退化为链表结构因此性能也大幅度下降,因此为了解决此问题我们下面要介绍的与二叉搜索树非常类似的结构就 ...
- 负的CPU保护环
什么是CPU保护环? 在计算机科学中, 分级保护域(英语:hierarchical protection domains),经常被叫作保护环(Protection Rings),又称环型保护(Ring ...
- Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To sta
eclipse出现:Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already i ...
- watch、computed、methods的区别
1. `computed`属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.主要当作属性来使用,要return出去一个值:2. `methods`方法表示一个具体的操作,主要书写业务逻辑:3. ...
- solr索引大小对比
原文本 Solr建立的索引 如果进行Mysql索引应该是1:3的比例
- flex布局入门总结——语法篇
前几天看了阮一峰的Flex布局教程,讲的很不错,总结一下,有兴趣的可以去看原文http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 一 F ...
- web前端总结面试问题<经常遇到的手写代码>
冒泡排序 var arr = [5,8,3,6,9] for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if( ...
- 【转载】vue.js实现格式化时间并每秒更新显示功能示例
引用:https://www.jb51.net/article/143351.htm 这篇文章主要介绍了vue.js实现格式化时间并每秒更新显示功能,结合实例形式分析了vue.js时间格式化显示与基于 ...
- 46.VUE学习之--组件之使用动态组件灵活设置页面布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP入门笔记--基础语法一
一.基本语法 php标记 <?php ?> php代码结束标记 三种注释 // /**/ # 二.类型 四种标量类型:boolean, integer, float, string 三种复 ...