「暑期训练」「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=& ...
随机推荐
- 2018.9.16 Redis 边学习边总结
Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合) ...
- Gulp 方法
Gulp有5个基本方法:src.dest.task.run.watch Gulp.src() gulp模块的src方法,用于产生数据流.它的参数表示索要处理的文件,一般有以下几种形式: js ...
- HashMap中的equals和hashCode
HashMap的存储方式 HashMap的实现方式是数组链,不同的对象根据其哈希码(hashCode方法的返回值)找到对应的数组下标,然后存入数组.不同的对象有相同的哈希码时怎么办?这就由数组链中的链 ...
- oracle 基本语法(一)
1.基本语句: .查询每个部门工资最高的人的详细记录 select * from emp e,(select max(sal) max,deptno from emp group by deptno) ...
- PAT1087. All Roads Lead to Rome
PAT1087. All Roads Lead to Rome 题目大意 给定一个图的边权和点权, 求边权最小的路径; 若边权相同, 求点权最大; 若点权相同, 则求平均点权最大. 思路 先通过 Di ...
- 网页静态化技术Freemarker
1.为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息 ...
- video object detection
先说一下,我觉得近两年最好的工作吧.其他的,我就不介绍了,因为我懂得少. 微软的jifeng dai的工作. Deep Feature Flow github: https://github.co ...
- Hibernate知识点小结汇总
Hibernate部分 1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复 ...
- Mybatis中使用UpdateProvider注解实现根据主键批量更新
Mapper中这样写: @UpdateProvider(type = SjjcSqlProvider.class, method = "updateTaskStatusByCBh" ...
- ABAP术语-Company Code
Company Code 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/16/1040816.html The smallest organ ...