![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
思维,贪心
文章平均质量分 56
思维,贪心
陌上花开 ~
越努力,越幸运(研究生在读)
展开
-
VK Cup 2021 - C. Bottom-Tier Reversals(思维,构造)
C. Bottom-Tier Reversals思路:首先想一下什么情况下会无解,因为一共有奇数个数字,而且可交换的前缀串长度也是奇数,所以无论如何变换,起初的数字所在位置的奇偶性一定都不会变,然后讨论如何构造,我们只需要以下5步便可以确定最后2个数字,依次搞定所有数字即可代码:#include <bits/stdc++.h>#define all(x) (x).begin(), (x).end()#define closeSync ios::sync_with_stdio(0)原创 2021-09-03 20:45:43 · 329 阅读 · 0 评论 -
贪心类问题总结
目录区间问题区间选点区间问题区间选点给定 NNN 个闭区间 [ai,bi][a_{i},b_{i}][ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点,输出选择的点的最小数量(位于区间端点上的点也算作区间内)思路:将每个区间按照右端点从小到大进行排序,从前往后枚举区间,end值初始化为无穷小代码:#include <iostream>#include <algorithm>using namespace std;const int原创 2022-04-03 22:23:47 · 805 阅读 · 0 评论 -
2022牛客寒假算法基础集训营2,小沙的魔法(并查集,离散化)
传送门思路:区间从0增加到目标值,等价于初始就是区间目标值情况下,每次使得区间-1,最后使目标值全部变成0,那么整体思路就是先把高的点降下去,然后等到这个边连接的两个点高度相同的时候,把他们连接起来,所以我们可以找到每边的两个点高度较低的那个作为这个边的权值(高度降到较低的那个时,才是两点相连的时候),将边权从大到小排序,从大到小遍历,在遍历过程中寻找所在连通块,进行合并(抽象成一个点,让他们高度相同),由于权值过大,所以离散化一下即可代码:#include <bits/stdc++.h&g原创 2022-01-29 12:15:00 · 133 阅读 · 0 评论 -
牛客练习赛 95 C-Division(思维,差分)
传送门思路:首先把数组中数字取对数,替换成需要进行除2操作的次数,之后从左到右扫描数组,每次尽可能选取比较大的区间进行 -1 操作,如果尽可能大都不满足 r−l+1≥kr−l+1≥kr−l+1≥k ,则输出 -1 ,在从左到右一次次清零过程中,为了操作次数最少,我们可以贪心的想,每次操作后形成的序列非递减就可以了,加大一次性选取的区间长度代码:#include <bits/stdc++.h>#define ll long long#define mod 1000000007#def原创 2022-01-21 16:32:58 · 801 阅读 · 0 评论 -
2022牛客寒假算法基础集训营2,小沙的数数(贪心,位运算)
传送门思路:由于在二进制拆位最后同位情况下如果存在不止一个一,那么异或之后的贡献一定小于我们的费用,所以我们要保证对于每一位的个数要么是0,要么是1,这样的话才能保证a[∧]=a[+]a\left[\wedge\right] =a\left[ +\right]a[∧]=a[+](因为a+b=2∗(a&b)+a∧b≥a∧ba+b=2\ast \left( a\& b\right) +a\wedge b\geq a\wedge ba+b=2∗(a&b)+a∧b≥a∧b,所以a[∧]原创 2022-01-28 18:08:23 · 358 阅读 · 0 评论 -
2022牛客寒假算法基础集训营1,B站与各唱各的(公式推期望,逆元)
传送门思路:首先注意到句子与句子之间没有办法互相影响,因此答案是一句话的期望qqq乘以mmm,由于无法交流,每个人在唱每句(第iii句)时唯一的策略就是随机以的概率pip_{i}pi决定唱或不唱这一句,又由于nnn个人之间没有区别,所以不同人的概率一定是相等的,因此pi≡pp_{i}\equiv ppi≡p,因此,唱失败的概率是pn+(1−p)np^{n}+\left( 1-p\right) ^{n}pn+(1−p)n,求其最小值得p=12p=\dfrac{1}{2}p=21所以最终答案为m(原创 2022-01-28 17:30:40 · 833 阅读 · 0 评论 -
Edu codeforces121 C Monsters And Spells(思维)
传送门思路:游戏的主人公可以通过蓄力来杀死怪物,游戏过程中,他也可以随时选择终止蓄力,即从1开始重新蓄力我们分析数据,如果从前往后处理数据,将无法判断终止蓄力的时间,一旦最后有一个极大的数据,会导致前面功亏一篑,因此从后往前进行分析,如果后两个时间差(k[i]−k[i−1]k[i]-k[i-1]k[i]−k[i−1])大于等于后面的血量(h[i]h[i]h[i]),那么终止蓄力,后面的怪物就可以从1开始消灭,此时计算蓄力区间即可,否则我们不终止蓄力,看最少需要多少能量可以同时消灭 iii 和 i−1i原创 2022-01-18 19:13:59 · 2733 阅读 · 0 评论 -
Codeforces1627 C Not Assigning(dfs,思维)
传送门思路:首先,要满足单条边的权值以及相邻两条边的权值和都为质数,这一定得是一个链表,我们找到链的端点,依次赋值2,3即可刚开始tle了,后来发现是初始化耗时太长tle的初始化部分:void init(){ cin>>n; ff(i,1,n)v[i].clear(); //对vis和ans不能用clear fill(vis.begin(),vis.end(),0); fill(ans.begin(),ans.end(),0);}修改后的原创 2022-01-18 00:12:09 · 637 阅读 · 0 评论 -
贪心与sort的cmp(返回常数或表达式)
让sort的cmp返回1或0时的情况:#include<bits/stdc++.h>#define LL long long#define fo(i,a,b) for(int i=a;i<b;i++)using namespace std;int a[5]={9,6,7,5,8};void pri(int a[5]){fo(i,0,5)cout<<a[i]...原创 2020-04-18 19:51:50 · 447 阅读 · 0 评论 -
Cf#741-C. Rings(构造)
C. Rings先贴上我错误的代码:#include <bits/stdc++.h>#define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)#define multiCase int T;cin>>T;for(int t=1;t<=T;t++)#define debug(x) cout<<#x<<":"<<x<<endl;#define f(i,a原创 2021-08-27 12:29:08 · 250 阅读 · 0 评论 -
k小数查询(牛客练习赛87-B,思维)
k小数查询思路:满足条件的区间分三种情况,区间的右端点是x,区间的左端点是x,或者x在区间的里面(且既不是区间的左端点也不是区间的右端点),把这三种情况求和即可,我们先找到x,然后向两边去维护两个数组L[q]和R[q],其值为有q个数比他少的情况有多少种,对于中间那种情况,枚举一遍即可,这样会有一个小问题,当k为1的时候,ans要加1,因为自己一个数也算一种情况了,特判就好代码:#include<bits/stdc++.h>using namespace std;#define l原创 2021-08-21 13:00:17 · 137 阅读 · 0 评论 -
An Easy Problem(二分,堆)
An Easy Problem题意:给你n∗mn*mn∗m的矩阵点阵(有n∗mn*mn∗m个点),让你找与原点围成面积的第k大值思路:二分:二分我们想要的第k大值,如果这个面积不够大,也就是能围成这个面积的点少于k个,那么扩大这个面积,让l=mid+1,否则,就缩小面积,让r=mid,check函数就扫一遍每一行,看每一行有多少点满足就好了,复杂度为:nlog(nm)nlog(nm)nlog(nm)代码:#include <bits/stdc++.h>#define debug(原创 2021-08-12 00:57:22 · 188 阅读 · 0 评论 -
限制不互素对的排列(构造)
限制不互素对的排列传送门思路:遇到问题先去想简单的算法,首先我们惊奇的发现k<=n/2k<=n/2k<=n/2,那么我们就可能可以投机取巧,用所有2的倍数,构造出相邻gcd>1相邻gcd>1相邻gcd>1的序列。在构造的过程中,我们发现在k==n/2k==n/2k==n/2时,偶数是不够的,恰好少1个,这个时候我就开始犹豫,怀疑自己方向错了,但其实是多余的,因为这种没有解的情况,仅限于n<6的时候,因为之后我们可以用3构造出另外一对解:3和6,这样问题就解决了原创 2021-07-31 23:05:57 · 119 阅读 · 0 评论 -
贪心(国王游戏,机器人)
国王游戏贪心地推出一个结论就好,证明很easy (直接将所有大臣按左右手上的数的乘积从小到大排序,得到的序列就是最优排队方案)代码:#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;typedef pair<int, int> PII;const int N = 1010;int n;原创 2021-02-26 23:57:48 · 184 阅读 · 0 评论 -
Cf-681-B. Saving the City(贪心)
B. Saving the City思路:可知要引爆必定花费一个a,对于两段1区间中间隔着的0,既可以花费cnt*b来全部安装上地雷,也可以花费a引爆我最初代码(丑死了QAQ):#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <cstring>#include <se原创 2021-02-18 02:18:16 · 102 阅读 · 0 评论 -
思维题(CF - 1332C,CF - 1325C)
C. K-Complete Word题意:给你一个字符串s,问你把他变成一个周期为k的周期回文字符串(回文是指s整体回文)最少需要改变多少个字符思路:因为这是一个周期回文字符串, 那么每一个周期一定是一个回文串, 把每个周期的位置压缩到原周期的一半, 记录每个周期对应的同一个位置每个字符的数量, 用重复量最大的那个字符替换就好了代码:#include <iostream>#include <cstring>#include <algorithm>#inc原创 2021-02-07 19:45:38 · 176 阅读 · 0 评论 -
CF - 629 - D - Carousel(思维)
题目:Carousel 大意:给你n个图案(每个图案都有一个数字),围成圆环,让你涂色,条件是相邻的图案的数字如果相等那么就不能涂相同的颜色,求最小不同色数思路:只用一种颜色的话肯定必须要所有动物都是同一种;其次考虑用两种或三种颜色如果n是偶数,只要2种颜色就行(相邻的分别涂1、2)如果n是奇数,要想办法把奇数变为偶数,所以就可以进行缩点(相同颜色相邻合并),这里缩点不要缩多,只要2个就行,把奇数个变为偶数个,然后分别涂1、2;如果不能缩,那么就是3个,最后一个涂3就行实现:首先边读入原创 2021-02-01 18:04:50 · 122 阅读 · 0 评论 -
贪心(AtCoder 189 C,CodeForces - 1328C)
AtCoder 189 C题意:给你一个长度小于1e4的正数组成的数组,从中选一个长为a的连续区间,满足这个区间的每一个数都大于等于b,求a∗ba*ba∗b的最大值,其中a和b你可以任意选定思路:贪心,最优解一定满足b为这个最优区间的最小值(反证法: 如果b比最优区间的最小值还大的话,最优区间就不是它了,b比最优区间的最小值还小的话,就不是最优解了)这个最优区间左端点左边的值要么不存在,要么比b小,同样右端点右边的值要么不存在,要么比b小(反证法: 否则最优区间还可以变大,与题意不符)结论原创 2021-01-24 21:59:12 · 222 阅读 · 0 评论 -
贪心(区间,打印收费,赛车)
思路:按左端点从小到大排序,之后判断能否合并or开辟新区间即可#include <iostream>#include<bits/stdc++.h>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>#include <cstring>#include <set>#include <map>#i.原创 2021-01-16 23:33:57 · 86 阅读 · 0 评论