02 2025 档案
摘要:首先要考虑两个人的策略分别是什么,显然A每次要吃最小的蛋糕,B要么不吃,要么就把一种类的蛋糕全部吃完。所以也是动态规划dp[i][j]表示吃第i种蛋糕,B吃了j次后x的最小值 `#include<bits/stdc++.h> using namespace std; define int long
阅读全文
摘要:动态规划,dp[i][j],j=0/1表示此人说真话还是假话,因为说谎者的数据不可信,所以转移时没有任何条件dp[i][1]=dp[i-1][0];而说真话的人有两种情况,前一个人说真话或者说假话,分开讨论,最后结果就是dp[n][0]+dp[n][1]; `#include<bits/stdc++
阅读全文
摘要:将第一个序列标号,所以序号和值就相互映射,再将第二个序列用映射转变一下,最后只要求转变后的序列的最长上升子序列就行了,求lis只要维护一个单调递增的栈,大于栈首就入栈,小于栈首就用二分查找替换最小的大与它的数 `#include include include include<math.h> usi
阅读全文
摘要:将m个宝物一一拆开,就是普通的0-1背包问题,但是这样会超时,所以想到用二进制拆分m,最后再当做0-1背包问题 `#include include include include<math.h> using namespace std; const int N=2e7+7; int w,n; int
阅读全文
摘要:最基础的0-1背包问题,没什么好说的 `#include include include include<math.h> using namespace std; const int N=2e5+7; int t,m; int lst[107][2]; int memory[107][1007]={
阅读全文
摘要:只要维护一个dp[i]就行了,dp[i]表示以i结尾的最大字段和,要么是第i个数本身,要么是第i个数加上dp[i-1],只要dp[i-1]>0,那么就肯定是后者 `#include const int N=2e5+7; int main(){ int n,lst[N]={0}; scanf("%d"
阅读全文
摘要:典型的八皇后问题,用回溯遍历每一种情况,当前格子能放皇后就放,直到剩余皇后数量为0输出情况。而判断是否能放就是判断当前位置的横,竖,左斜,右斜是否有皇后,横竖都好判断,而左斜的位置index的和相等,右斜的位置index差相等。 `#include<stdio.h> include<string.h
阅读全文
摘要:遍历整个二维数组,将数字相同的都入队,然后标记已经处理过,接着开始处理,判断每个位置是否都比相邻的不同高的位置高或低,就可以判断这些数是否为山谷或山峰 `#include include int que[1000007][3]; int m1[8]={-1,-1,-1,0,0,1,1,1},m2[8
阅读全文
摘要:通过回溯搜索满足第一种维他命的情况,然后用这种情况检验其余维他命是否满足 `#include int v,lst[27],g,lst_v[17][27],p=0,f=1; int index[17]={0}; int My_sum(int n){ int sum=0; for(int i=0;i<g
阅读全文
摘要:以每一个1为起点向外搜索,不断更新最近距离,如果不能更新则剪枝,不然会超时 `#include int n,m; char a; int m1[4]={-1,1,0,0},m2[4]={0,0,-1,1}; struct q1{ int i,j; int d=0; } q_bai[2000007];
阅读全文
摘要:题目说只有一个包围圈,所以除了与边界相连的0,其余0都在包围圈内,所以只要把边界遍历一遍,将与边界相邻的0都标记出来,剩下的0都是要转换成2的 `#include struct hao{ int i,j; } que[1000007]; int head=0,tail=0; int main(){
阅读全文
摘要:题目意思很简单,就是把一个数按照字典序拆分,很显然可以用回溯,把每种可能都遍历一遍,遇到不可能的情况就剪枝 `#include int lst[10]={0}; int n,sum=0; void solve(int res,int p){ if(res0&&lst[1]!=n){ for(int
阅读全文
摘要:注意到两个素数之间是肯定不可以相互生成的,所以如果数组中包含两个及以上的素数时,x就不存在。而当数组中不包含素数时,2就是一个满足条件的数,因为任意偶数都可以由若干个二相加得到,而奇数肯定存在一个奇数因子(因为前提条件是都是合数),这个奇数减掉这个因子就变成了偶数,可以由2生成。当数组中有且仅有一个
阅读全文
摘要:题目可以转换成求哪个数的因数出现次数最多,并输出这些因数的位置,所以也可以用埃氏筛的思想,这样可以避免重复计算。用一个数组sum[]来记录总次数,index就是具体的那个数,因为m<=1e6,所以数组是可以开出来的,每遇到一个数,就把sum中index为这个数的倍数的位置都++,因为一个数肯定是它倍
阅读全文
摘要:根据题意,数对交换位置算不同数对,所以只要考虑p<=q就行了,交换一下就是结果乘二,但要注意当p=q时要减掉一。最小公倍数可以用pq==xy来代替,最大公约数就是gcd(p,q); `#include<stdio.h> include include include<stdlib.h> includ
阅读全文
摘要:正常暴力就是每个数判断是否为素数,但这样会超时,所以要用埃氏筛,因为每一个数都可以唯一拆解为若干个素数乘积,所以只要r^0.5以内的素数都求出来,然后在[l,r]区间内把合数筛掉,剩下的都是素数了 `#include<stdio.h> include include include<stdlib.h
阅读全文
摘要:显然,相邻的两个数是互质的,但题目只定义[1,1]为一个区间,所以1要单独判断 `#include<stdio.h> include include include<stdlib.h> include<string.h> include include<bits/stdc++.h> using na
阅读全文
摘要:首先a,b,d的范围大的离谱,显然不能直接读入,所以一边读入一边取模,然后注意到19260817是一个素数,显然可以用费马小定理,a^(p-1)=1(mod p).但我这里的代码是取模的线性替换 `#include<stdio.h> include include include<stdlib.h>
阅读全文
摘要:破环为链,并且将链延长一倍就不用考虑C>d了,并且题目说每个战士的奔袭区间都不被包含,所以以左端点排序后,注意到右端点必定单调,这就可以用贪心思想了,让下一个战士能尽可能远,只需要左端点尽可能远,不过要满足左端点在前一个战士的右端点前。第一个想法是暴力,显然会超时,就算用二分查找也会超时(别问我怎么
阅读全文
摘要:一开始想到暴力,但显然超时,所以换一个思路,不是考虑这头奶牛需要仰望谁,考虑这头奶牛被谁仰望,于是就会想到维护一个单调递减的栈,将比栈首低的奶牛入栈,遇到比栈首高的就出栈,直到栈首比这头奶牛高为止,再将这头奶牛入栈,等所有奶牛都完成后,还剩在栈里的就是没有仰望对象的奶牛。 `#include<std
阅读全文
摘要:约瑟夫环,用lst来表示环(已经编过号),flag来标记是否出队(0为在队中,-1为出队了),t表示报数,p来遍历环,ans来记录环中剩余人数,剩最后一人就退出循环,遍历一遍flag输出最后一人的编号 `#include<stdio.h> include include using namespac
阅读全文
摘要:贪心思想,每次合并最小的两堆就能使总消耗最少,所以考虑优先对列,不过要从大到小。 `#include<stdio.h> include include using namespace std; int main(){ int n,a; priority_queue<int,vector,greate
阅读全文
摘要:ST表模版题,用暴力显然超时,所以要采用倍增思想,把一个区间最大值转换成两个子区间的最大值,一直二分下去,直到变为单个值,这样维护一个dp[i][j],i为起始位置,j为2^j长度,这样每次查询的时间复杂度为O(1) `#include<stdio.h> include<stdlib.h> incl
阅读全文
摘要:优先队列模版题,没什么好说的 `#include<stdio.h> include<stdlib.h> include<string.h> include<bits/stdc++.h> using namespace std; int main(){ priority_queue q; char a
阅读全文