暴力
_Rikka_
- v -
展开
-
codeforces 1555 C. Coin Rows (暴力+前缀和)
题目思路:主要注意看一个条件只有两行,且只能向右或向下走,那Alice只有N种移动情况,从第一列就开始下移再往右,先右行至第二列再下移往右,先行至第三列再下移…而对于每种情况Bob实际上只会从两种情况选一种最大的,一种是只取第一行中Alice没走过的,一种是第二行中Alice没走过的,看下面例子Alice是蓝色线,Bob贪心之下选的是Max(6,5+2)=7。最后的答案只要把Alice的所有情况都遍历一遍,取所有情况的最小即可(注意用前缀和优化),细节看代码。#include<iostream原创 2021-07-31 00:58:59 · 406 阅读 · 0 评论 -
蓝桥杯 子串分值(算贡献)
思路一开始看到数据范围,n=1e5,那么只可以遍历一次,那么如何在一次之内算出全部贡献?细心一些可以发现对于字母来说只有26个,这便是本题的突破口,我们只需在这一次遍历内算出每个字母的贡献即可。首先将子串分为n类—以第i号元素为结尾的子串(1<=i<=n)a对于以第i号元素为结尾类子串的贡献=0(第i号元素之前没出现过a)=a出现时的位置(在第i号元素之前a只出现过一次)=最近两次a出现过的位置之差(在第i号元素出现之前a出现两次以上)由上知道我们所需记录的信息就是在当前第i号元.原创 2021-04-15 19:50:21 · 372 阅读 · 0 评论 -
1498C - Planar Reflections (暴力+前缀和+模拟)
题目思路:模拟一下过程,有n个平面,那么在一次飞跃中位于第1个平面的粒子向右飞会在后面每个平面都产生一个粒子,那第一个平面有m个粒子后面每个平面2–n都产生m个粒子,同理第二个平面的每个粒子也会对其后面的所有平面产生一个粒子。然后最共会裂变n-1次进行这么多次飞跃,要分一下飞往右再变换一下飞往左。再来看一下数据大小n<=1000,k<=1000。如果直接暴力模拟 O(n^3),但对于给第i个平面后面所有平面粒子+1的操作可以用前缀和处理,复杂度变为 O(n^2),细节见代码。Code:#原创 2021-03-30 14:17:17 · 219 阅读 · 0 评论 -
1462D Add to Neighbour and Remove(暴力)
题目思路:可以知道对于n个元素的数组总共只有n种情况,值可以平均分为1份2份3份…n份,那么我们直接暴力枚举,从可以分为n份一直到可以分为一份,假如分为5份,s=总值/5,从开始遍历相加发现有>s的必然不能成功,开始从4份再枚举,如果正好可以分为5份,则直接输出n-5(5份可以不用合并)即为最小操作数,细节见代码。Code:#include<iostream>using namespace std;const int Max = 1e6 + 5;int lst[Max];i原创 2020-12-16 21:46:18 · 322 阅读 · 2 评论 -
C. The Number Of Good Substrings(思维&位运算)
题目题意:给出一串01串,我们要计算其好串的数量。对于sl,sl+1,…,sr 如果r−l+1=f(sl…sr).则其为好串,f(sl…sr)=从sl开始的二进制数值.思路:直接暴力+位运算,观察一下就能发现我们要求的字符串长度只有21e5,而一个二进制数当其长度大于20的话已经大于了21e5,所以我们只需全部遍历一遍,每当发现一个1后向后遍历20位即可。而对于每一次是否能形成一个好串只需判断这个位置的前导零的个数+这个数往后的长度是否大于从这个数往后遍历一定长度由二进制转换成十进制的值,模拟一下二进制原创 2020-12-10 16:44:30 · 269 阅读 · 0 评论 -
C. Going Home (抽屉原理、范围、暴力)
题目抽屉原理看题目的数据,其中可以发现两个数相加结果最大也只是5e6,根据抽屉原理,只要有5e6+1个数就至少会有两个数相加得到相同的值。那么也就是说只要枚举出来的两个数相加的答案最多有5e6+1个就一定会得到至少两组坐标满足相加相等,直接暴力即可。#include<iostream>using namespace std;typedef long long ll;const int Max = 5e6 + 5;int lst[Max];int ls[Max][2];int m原创 2021-03-16 22:47:43 · 220 阅读 · 2 评论 -
1408D - Searchlights (思维、枚举)
题目从结果来分析,最小的步数必然是往右走多少步使一部分盗贼到达安全区域,然后再向上走一部分使余下的盗贼到达安全区域。那么我们从0到1e6+1枚举所有向右走的步数加上在该步数下最小向上走的步数,取其中最小值即为答案。那么问题来了,这个最小向上走的步数我们如何能够快速得到答案?其实只需要一个从后往前遍历记录的向上移动所需最大值数组即可。简单来说就是,对于一个盗贼x,y,灯塔tx,ty,可以让盗贼向右移动tx-x+1使其脱离范围,也可以使其向上移动ty-y+1使其脱离范围。然后我们用一个数组dis[tx-x+原创 2021-02-22 23:24:01 · 170 阅读 · 0 评论