
思维
1E6
这个作者很懒,什么都没留下…
展开
-
D. Say No to Palindromes (dp+思维)
D. Say No to Palindromes题目链接大致题意:给出一个字符串以及字符串的长度n,有m次询问,每次询问给出l,r,求区间l,r不存在长度大于2的回文串最少需要进行几次修改(只包含abc三种字符,修改也只能包含abc三种字符)解题思路:对于只有abc三个字符构成的字符串,使得其不存在长度大于2的回文串,必然是存在循环节的,即abcabcabc这样那么对于三种字符,循环节的种类有六种,我们需要处理出字符串对于每个循环节需要做出的修改次数f[i][j]表示对于第i个循环节,到第j原创 2021-08-01 10:30:01 · 297 阅读 · 0 评论 -
C. Canine poetry (贪心)
C. Canine poetry题目链接大致题意:给出一个字符串,可以任意修改字符串中的任意字符,问最少操作多少次可以使得这个字符串中不存在长度大于1的回文串解题思路:对于一个回文串来说,只要我们破坏掉其中长度是2或者长度是3的回文串,那么更长长度的回文串也会被破坏掉,即aba,aa,aaa这三种情况,所以贪心的修改,使其不存在长度>2的回文串即可AC代码:#include <bits/stdc++.h>using namespace std;int main() {原创 2021-08-01 09:20:09 · 173 阅读 · 0 评论 -
A. Pride (思维)
A. Pride题目链接大致题意:给你一个长度为n的数组a,每次操作你可以选择相邻的两个位置a[i],a[i+1],将其中某一个数用gcd(a[i],a[i+1])来代替你的目标是最后将a中所有元素都变成1,问最少需要多少次操作解题思路:有三种情况:1.如果所有的数的gcd不等于1,那么输出-12.如果数组中存在1,那么答案为n-cnt1(1的个数)3.枚举gcd等于1的最小区间,答案为len-1+n-1len表示gcd等于1的最小区间,使gcd变成1需要len-1次操作,然后就出现1原创 2021-07-21 13:25:35 · 178 阅读 · 0 评论 -
C. Vasya and String (尺取法)
C. Vasya and String题目链接大致题意:给出一串只有a和b构成的字符串,字符串长度为n,可修改字符限制个数为k求能得到的最长连续相同的字符串的长度解题思路:尺取法维护区间内字符a的个数和字符b的个数如果numa <= k || numb <= k,说明区间[l,r]可以修改为满足条件的情况,更新答案即可AC代码:#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <=原创 2021-07-16 22:51:34 · 160 阅读 · 0 评论 -
C. Woodcutters (贪心||dp)
C. Woodcutters题目链接大致题意:一条路上有树,树有高度h,我们可以将树向左或向右砍倒只要它倒下去不会压到其他树(不论这些树是站着还是倒下了)求最多可以砍倒多少树解题思路:贪心第1个数左倒,第n个树右倒,剩下的树优先左倒即可dp状态表示:f[n][3]表示三种状态下对应的最大值,f[i][0]表示不砍,f[i][1]表示向左倒,f[i][2]表示向右倒分析:优先左倒,按照情况转移即可AC代码:#include <bits/stdc++.h>#define原创 2021-07-16 21:32:41 · 444 阅读 · 0 评论 -
C. Letter (前缀和)
C. Letter题目链接大致题意:把字符串变成左边大写,右边小写的形式,最少需要改变几个字符(指大小写互换)解题思路:前缀后缀和l[i]记录从最左端到i的小写字母的个数 r[i]记录从最右端到i的大写字母的个数如果s[i]是大写字母,res = min(res, l[i - 1] + r[i])如果s[i]是小写字母,res = min(res, l[i] + r[i + 1])AC代码:#include <bits/stdc++.h>#define rep(i, n原创 2021-07-14 09:44:05 · 452 阅读 · 0 评论 -
New Year and Ascent Sequence (思维)
New Year and Ascent Sequence题目链接大致题意:给出n个序列,任选两个进行连接(n2种情况),求满足i<j&&a[i]<a[j]的连接个数解题思路:分别存一下每个序列的最大值和最小值给最大值排序,遍历最小值,如果最小值<最大值,那么当前最小值的贡献就是最大值的位置到末尾的个数有特殊情况,就是不进行连接,该序列本身已经满足条件,只需要把该序列的最大值设为INF,最小值设为-1即可最后在遍历过程中累加贡献即为答案AC代码:#in原创 2021-07-09 11:43:39 · 135 阅读 · 0 评论 -
K for the Price of One (Easy Version) (贪心+前缀和)
K for the Price of One (Easy Version)题目链接大致题意:商店买东西,商店有n个物品,每个物品有自己的价格商店有个优惠活动. 当你买恰好k个东西时可以只为其中最贵的那个付款求有限的钱中买到的最多的物品数量,你可以多次使用优惠解题思路:贪心+前缀和排序,求出前缀和,当你买第i件物品时,只需要支付sum[i-k]+a[i]的价钱,因为k件物品,你只需要支付最贵的那一件价格在求出sum[i]=sum[i-k]+a[i],表示买到第i件商品需要支付sum[i]的原创 2021-07-08 19:12:34 · 180 阅读 · 0 评论 -
As Simple as One and Two (贪心)
As Simple as One and Two题目链接大致题意:给出一个字符串,删掉最少的字符,使字符串不能存在"one"或"two"的字串输出删掉字符个数,以及对应的下标解题思路:对于"one"删掉中间的n对于"two"删掉中间的w存在特殊情况"twone"删掉中间的o为什么都删掉中间的字符?因为"ttwo"这种情况,所以删掉中间的才能彻底去掉"one"或"two"AC代码:#include <bits/stdc++.h>#define rep(i, n) for原创 2021-07-07 11:38:59 · 174 阅读 · 0 评论 -
Three displays (思维)
Three displays题目链接大致题意:给出n个数值,以及对应的费用,满足三个数下表,数值递增,求费用和最小解题思路:数据3000,复杂度O(n^2)固定中间的数j,找前一个数i<j,且数值a[i]<a[j],从满足条件的数值中找费用的a[i].后一个数同理AC代码:#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define debug(a) cou原创 2021-06-16 20:02:21 · 128 阅读 · 0 评论 -
Air Conditioner (思维)
Air Conditioner题目链接大致题意:一个空调初始温度是m,每分钟可以选择温度+1或者温度-1或者温度不变.有n个客人,分别在ti时间到达,每个客人有一个温度适应的范围[l,r]. (客人按时间顺序到达)问是否可以使所有客人都感到满意解题思路:新的客人到达与前一位客人会有一个时间间隔d,因此空调温度的变化范围为[l-d,r+d]空调温度要满足新客人的温度适应范围,我们可以两个区间取交集,看是否为空,若为空NO,反之YESAC代码:#include <bits/stdc原创 2021-06-16 18:56:04 · 460 阅读 · 0 评论 -
Diverse Garland(贪心)
题目链接: Diverse Garland大致题意:给出一个长度为n的字符串,要使字符串相邻两个字符不同,最少需要改变几次字符解题思路:贪心AC代码:#include <bits/stdc++.h>using namespace std;int n;int main() { string s, str; cin >> n >> s; int res = 0; for (int i = 1; i < n; ++i) { if (s[原创 2021-01-21 11:00:55 · 157 阅读 · 0 评论 -
Create The Teams(贪心)
题目链接: Create The Teams大致题意:多组,给出n个数,求最多可以分多少组,要求是每一组的最小元素*组的元素个数要大于等于x解题思路:从大到小排序,贪心处理,能一个人组队就一个人组队,不能再加人,直到大于等于x为止AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 1e5 + 10;i原创 2021-01-19 20:09:32 · 157 阅读 · 0 评论 -
Strange Birthday Party(贪心)
题目链接: Strange Birthday Party大致题意:n个人,m件礼物,每件礼物对应价值c[i](递增给出),每个人对应一个编号a[i],你可以送编号<=a[i]的礼物,也可以直接送c[a[i]]的现金,求怎么送礼物使得花费最小解题思路:礼物是唯一的,贪心分配礼物,把最便宜的礼物分配给编号最高的人AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int原创 2021-01-11 23:11:11 · 368 阅读 · 0 评论 -
HDU - 5933 ArcSoft‘s Office Rearrangement(贪心)
题目链接: [ArcSoft’s Office Rearrangement]大致题意:有n个数,对于这n个数,每次只能执行下面两种操作其中的一种:1.将相邻的两个数相加合并成一个数,2.将一个数分成相邻的两个数,这两个数的和仍然等于之前的数请问至少需要多少次操作才能将这n个数变成k个相等的数解题思路:贪心 因为数据给出的就是要求线性的算法,所以,从左往右贪心首先特判一下n个数总和是否被k整除,然后考虑该怎么进行贪心,其实在贪心过程中不需要考虑k,他有迷惑性,容易诱导你走不出来,既然能原创 2020-09-24 23:14:02 · 99 阅读 · 0 评论 -
Greatest Common Divisor(差分+gcd)
Greatest Common Divisor题目链接大致题意:给出一个序列,每次操作可以使序列中每个元素加1,问最少进行几次使得gcd(a1,a2,…,an)的值>1,无解输出-1解题思路:将序列转换为差分数组,原序列的gcd=差分数组的gcd每次操作,只有b[1]会发生改变,因此gcd(b2,b3,…bn)的值不变先求出g=gcd(b2,b3,…bn),然后就是求gcd(b[1]+k,g)>1中的kgcd(b[1]+k,g)>1说明b[1]+k和g有大于1的公共因子,枚原创 2021-05-07 15:04:54 · 357 阅读 · 0 评论 -
Count Triangles(前缀和+差分)
题目链接: Count Triangles大致题意:给你a,b,c,d,并且a<=x<=b<=y<=c<=z<=d,问有多少个x+y>z解题思路:x+y的最小值为a+b,最大值是b+c,我们可以差分计算出,这个区间内每个数有多少种可能的情况,再对数组计算前缀和,最后枚举z,看对于当前的z,有多少x+y>z的组合AC代码:#include <bits/stdc++.h>using namespace std;typedef lo原创 2021-01-17 15:38:47 · 315 阅读 · 1 评论 -
Given Length and Sum of Digits...(构造+贪心)
题目链接: Given Length and Sum of Digits…大致题意:给出长度m,和s,计算十进制下每一位总和是s,长度是m的最小值和最大值解题思路:构造+贪心注意:不能有前导零AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;int main() { int m, s; cin >> m >> s; if (s < 1 &原创 2021-01-16 23:10:32 · 285 阅读 · 0 评论 -
CodeForces - 1249C2 Good Numbers (hard version)
题目链接:Good Numbers (hard version)大致题意:规定一个好数为由3的不同次幂相加的和,给出一个n,要求在等于n的范围中,找到一个最小的好数解题思路:两种想法:1.把3的各个幂相加,得到一个大于等于n的数,然后从小到大依次减去3的各个幂次的值,且两者的差满足大于等于n;1e18转化成3进制,最多是38位,完全可以过时间复杂度:O(n)2.好数的要求其实就是三进制每一位要么是0,要么是1把十进制转化成三进制,从最高位找到第一个为2的位,然后把之后的位包括当前位原创 2020-10-25 16:34:36 · 207 阅读 · 0 评论 -
Boboniu and Bit Operations(暴力枚举+位运算)
题目链接: Boboniu and Bit Operations大致题意:给出数列a,b,1<=a<=n,1<=j<=m,求出c[i]=a[i]&b[j],使得c[1]|c[2]|…|c[n]最小,一个a[i]可以和多个b[j]组合解题思路:a[i]b[j]<29,所以位运算的最大结果为29-1,答案就在[1,1<<9)。令ans=1<<9-1,二进制的所有位都是1,我们从高位到低位讨论每一位是否从1变为0。因为最后是与运算,所以a原创 2020-08-27 15:53:01 · 275 阅读 · 0 评论 -
Discrete Acceleration(浮点数二分)
题目链接:Discrete Acceleration大致题意:给一条路,范围是 [0,l] ,两辆车甲乙分别从左右向中间开,速度都是1。路中间有n个旗子,每经过一个旗子,车的速度+1问多少时间之后两车会相遇解题思路:二分二分枚举时间t,考虑甲通过这个时间走过的距离和乙通过这个时间走过的距离,看是否大于给的长度,如果大于就r=mid;反之l=mid;AC代码: #include<iostream> #include<algorithm> #i原创 2020-10-12 22:04:58 · 292 阅读 · 0 评论 -
Help Me(黑龙江大学程序设计竞赛B 找规律)
题目链接: [Help Me]大致题意:把公式化简解题思路:多写几个找规律AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 1e5;ll a[N], s[N];int main(void){ int t; scanf("%d", &t); while (t--) { memset(s,原创 2020-09-18 15:40:21 · 129 阅读 · 0 评论 -
HDU - 2050 折线分割平面
题目链接: [折线分割平面]大致题意:我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分解题思路:思路:列举找规律第1条折线,穿过0条线,多了1个区间;第2条折线,穿过2条线,多了5个区间;第3条折线,穿过4条线,多了9个区间;多的区间: 2*pow(2,n-1)+1 vs 2*2*(n-1)+1第4条折线,穿过6条线,多了13个区间;多的区间: 2*2*(n-1)+1AC代码:#include <bits/std原创 2020-09-12 09:12:29 · 143 阅读 · 0 评论 -
HDU - 2044 一只小蜜蜂...
题目链接: [一只小蜜蜂…]大致题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。解题思路:斐波那契数列AC代码:#include <bits/stdc++.h>typedef long long ll;using namespace std;ll dp[60];int main(void){ dp[1] = 1; dp[2] = 2; for (int i = 3; i <= 50; ++i) {原创 2020-09-12 09:04:33 · 93 阅读 · 0 评论 -
HDU - 2041 超级楼梯(简单题)
题目链接: [超级楼梯]大致题意:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?解题思路:斐波那契数列AC代码:#include <bits/stdc++.h>typedef long long ll;using namespace std;int dp[50];int main(void){ dp[1] = dp[2] = 1; for (int i = 3; i <= 40; ++i) { dp[i] = dp原创 2020-09-12 08:58:16 · 232 阅读 · 0 评论 -
ZOJ - 3880 Demacia of the Ancients
题目链接: [Demacia of the Ancients]大致题意:多组,找到数组中大于6000的个数解题思路:看代码AC代码:#include <bits/stdc++.h>typedef long long ll;using namespace std;int main(void){ int t; cin >> t; while (t--) { int n; scanf("%d", &n); int cnt = 0; for原创 2020-09-06 21:58:21 · 94 阅读 · 0 评论 -
FZU - 2272 Frog (第八届福建省大学生程序设计竞赛)
题目链接: [Frog]大致题意:T组,青蛙和鸡在一起,n代表头数,m代表腿数,求青蛙和鸡的数量,输出所有可能解题思路:类似于百钱百鸡,两重循环遍历,满足条件输出即可AC代码:#include<iostream>#include<cstdio>typedef long long ll;using namespace std;int main(void){ int t; cin >> t; while (t--) { int n, m;原创 2020-09-06 21:54:54 · 153 阅读 · 0 评论 -
ZOJ - 3869 Ace of Aces(简单题)
题目链接: [Ace of Aces]大致题意:T组,每组n个数,找到出现次数最多的一个数,若没有输出Nobody解题思路:看代码AC代码:#include <bits/stdc++.h>typedef long long ll;using namespace std;int a[2000];int b[2000];int main(void){ int t; scanf("%d", &t); while (t--) { memset(a, 0, s原创 2020-09-06 21:49:48 · 154 阅读 · 0 评论 -
Fliptile (搜索+二进制枚举)
题目链接: [Fliptile]大致题意:给出一个m*n的01矩阵,每次操作可以选一个位置,使它和它的上下左右翻转一次(0变1,1变0),问最少多少次操作可以使所有数都变为0,如果有,输出翻转的方案,否则输出IMPOSSIBLE解题思路:二进制枚举,枚举第一行的所有情况,一共有2m种,只要第一行确定,矩阵其他的就都可以确定,最后判断最后一行是否全为0即可。(判断每一行时,看上一行来确定当前行是否需要翻转,tmp记录上一行对当前行的影响)AC代码:#include<iostream>原创 2020-09-04 15:04:01 · 365 阅读 · 0 评论 -
FZU - 2283 Tic-Tac-Toe(第八届福建省大学生程序设计竞赛)(模拟三井棋)
题目链接: [Tic-Tac-Toe]大致题意:横竖斜连成一行获胜,问Kim能不能在两步之内完成连线,如果可以输出Kim win,否则输出Cannot win解题思路:分两种情况:1.如果两人下的棋的步数小于2,也就是只下了一步或者还没有开始,那么肯定Kim是不可能在两步之内取得胜利的。还没有开始的话两步就算对方没有去阻拦也不够三个棋子,只走了一步,接下来的两步中对方一定阻拦,也不会连成一条线。2.如果这时候步数大于等于2了,能否取得胜利的关键就是能否占领了最中间的位置或者在最中间的位置双方都没原创 2020-09-06 22:36:14 · 348 阅读 · 0 评论 -
Shuffle‘m Up(模拟)
题目链接: [Shuffle’m Up]大致题意:T组,给出长度为len的字符串s1,s2和长度为len*2的字符串s,每次取s2一个字符和s1一个字符,取len次组成s’,看s是否与s’相等,若不等,令s1为s’的前一半,s2为s’的后一半,反复以上操作。输出数据组编号和操作次数,经过多少次操作也无法结束循环,答案输出-1解题思路:模拟,读懂题就很好做了,直接看代码吧AC代码:#include<iostream>#include<cstdio>#include原创 2020-09-05 10:13:32 · 117 阅读 · 0 评论 -
ZOJ - 3882 Help Bob(博弈)
题目链接: [Help Bob]大致题意:有1~n个数,每次从中取出一个数,同时把这个数的所有因子取出,最后一个不能取数的人输解题思路:1是所有数的因子,所有第一次任取一个数1都会被取走先把1拿出来,对于其他的数分两种情况:1、如果先手必败,那么先手第一次取1,然后把这种必败的状态留给对手,则先手必胜2、如果先手必胜,则按照必胜的策越即可(1作为附带的被取出)AC代码:#include <bits/stdc++.h>typedef long long ll;using原创 2020-09-06 22:23:44 · 137 阅读 · 0 评论 -
牛客挑战赛 C.alan的DP题
alan的DP题题目链接大致题意:n件物品,对应价值是1-n,给出n件物品所对应的父亲物品,(在购买时,孩子可以代替父亲进行购买),给出m个同学对应想买的物品,求一个最大收益,也就是m个同学购买物品花费的最大值解题思路:题目提到i的父亲是p[i],表示如果想购买p[i],也可以选择购买i来代替p[i]数据3e6,线性求求最大收益,贪心想的话,肯定会优先购买最贵的物品,画出的是一个森林,我们拿其中一树来说的话,就是在面临选c[i]物品时,怎么可以直接求出c[i]的哪个儿子价值最大,被卡了半天原创 2021-05-12 08:46:17 · 155 阅读 · 0 评论 -
2021年度训练联盟热身训练赛第五场 F Group Project(染色+思维)
Group Project大致题意:n个学生,m对不友好的关系,求最多有多少友好的关系解题思路:先染色,在分析情况1.如果所有人都染了色,并且染0的学生人数乘染1的学生人数等于m,说明,只能是0与0组队,1与1组队,(也就是左边内部组队,右边内部组队),答案为染0的学生人数/2+染1的学生人数/22.只要不满足上述条件,那么答案就一定是总人数/2当然情况1和情况2也有答案相同的情况,就是左右两边的人数都是偶数,那么染0的学生人数/2+染1的学生人数/2=总人数/2AC代码:#include原创 2021-04-14 19:18:35 · 172 阅读 · 0 评论 -
Journey Planning(思维)
题目链接: Journey Planning大致题意:给出一个序列,求出选出元素和的最大值,要求是选出的元素值相减等于下标相减解题思路:一个连续上升序列的元素减下标的值一直是相等的,直接map遍历一遍AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 1e5 + 10;int n, m;int ma原创 2021-01-19 20:42:38 · 221 阅读 · 1 评论 -
Three Bags(思维+贪心)
题目链接: Three Bags大致题意:给定3个背包,每个背包放置若干个数(同一书包可能放重复的数,都是正数)。现在重复若干次以下操作:分别从两个背包拿出数a和b,将b从原来的背包中消除,将a变为a-b并替换a放回原书包。现在要使3个背包最终只剩下一个数,使得这个数最大,求该值解题思路:进行一次操作,相当于改变了b的符号,也就是说对一个数进行奇数次操作得到负的,进行偶数次操作得到正的我们可以保证其中任一背包里的数是正的,以A为例(下面解释原因)接下考虑B,C怎么操作会最优1.B,C分别剩原创 2021-01-17 16:46:40 · 596 阅读 · 0 评论 -
Shashlik Cooking(思维)
题目链接: Shashlik Cooking大致题意:给你一个n代表有n个初始状态为正面的羊肉串,k代表你每次可以随机选择一个数值i,把第 i-k 到第 i+k 个羊肉串翻过来问你最少需要多少次可以把所有羊肉串全部翻过来。解题思路:三种情况:1.k=0 肯定是翻n次2.n<=(2*k+1) 翻n/2+1的位置一次3.n>(2*k+1) ①n % (2 * k + 1) > k || !(n % (2 * k + 1)) 从k+1开始翻,每次翻隔2*k+原创 2021-01-14 14:31:09 · 273 阅读 · 0 评论 -
Simple Strings(思维)
题目链接: Simple Strings大致题意:改变最少的字符,使得最终序列无相同的连续的字符解题思路:对每一个与前一个字符相同的字符,枚举满足条件的字符进行替换AC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a, b, p;int main() { string s; cin >> s; int n =原创 2021-01-14 11:06:31 · 95 阅读 · 0 评论 -
Homecoming(思维)
题目链接: Homecoming大致题意:注意:连续相同字符花费一样,但下车会在后一个不同字符下车解题思路:细节很多,自己好好推敲一下先计算一遍走完整段路的花费,然后枚举,直到用的钱小于p或者到了nAC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a, b, p;int main() { int t; cin >&原创 2021-01-14 10:57:48 · 175 阅读 · 0 评论 -
Mike and strings(思维)
题目链接: Mike and strings大致题意:对于某个字符串,可以将前面字符删除添加到末尾问最少几步可以将这 n 个字符串都变成相同的,如果不行输出-1.解题思路:核心就是找n个字符最长的公共部分这里用到string.find,如果找到会返回下标,没有找到,会返回nposAC代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;string s[100];int main()原创 2021-01-13 23:39:50 · 259 阅读 · 0 评论