随笔分类 - 算法题&leetcode
摘要:#include #include using namespace std; const int maxk = 100; const int maxa = 63; unsigned long long d[maxk+1][maxa+1]; int main() { memset(d, 0, sizeof(d)); for(int i = 1; i > k >> n && k) { ...
阅读全文
摘要:感觉这道题读题有点难。。似乎和现实联系的比较密切1.每个process的两个资源可以顺序反一下2.p->q,q->s不可以同时进行 p->q,p->s可以 输出最长等待链输出每个process的资源调用顺序 (注意按输入顺序输出,并不意味着按输入顺序先后执行,只是输出方便看) 把资源看成点,一个pr
阅读全文
摘要:这道题思维很灵活。也有点套路的意思。 首先规定0,1分别按照原来的顺序接收,只是01换位。这样简化了思维。(否则并不会有更优结果它。,比较好想)最大值和最小值可以贪心得到。那么接下来就是给定一个整数P,判断能不能得到它。贪心法,从左到右判断P的每一位,从K中最左边的0或1取。这样会发现任意时刻k中已
阅读全文
摘要:注意这题要求互相认识不认识的人之间连一条线一个人在组1,那么不认识(互相认识)的人就在组0;同时这些人不认识的人就在组1.每个联通分量都可以独立推导,遇到矛盾则无解一个联通分量有一个核心,其他的点是分支我感觉紫书写的样例又是有点问题,应该是4在0,那么135在1,反正则反;而不是1在0,345在1然
阅读全文
摘要:fixing great wall 的变形dp(i,j,k,p)不考虑i-j的客人,还要送k个人,目前位置在p起点i和总数量k都要枚举dp(i,j,k,p)=max(dp(m,j,k-1,p)+valm,dp(i,d,k-1,p)+vald) 画一下图,就发现每个点罚时是当前k*abs【pi】
阅读全文
摘要:常见思路枚举最后一个方块A【j】何时消除 对于dp(i,j,k)就两种决策:转移到dp(i,p-1,0)+(j-p+1+k)^2 枚举q<p,A【q】=A【j】,A【q】!=A【q+1】,转移到d(q+1,p-1,0)+dp(i,q,j-p+k)
阅读全文
摘要:这道题超经典。dp和优化都值得看一看。因为i+1只和i有关,用滚动数组节省空间暑假第一次做感觉很困难,现在看就清晰了很多
阅读全文
摘要:按紫书来注意这道题的题目给了很大的方便,就相当于验证k是不是答案,不是的话就是k+1
阅读全文
摘要:我觉得这个题挺难的......首先这个题的结论 hp+kd我没有证明出来(范围肯定没有问题,根据数量少的时候和感觉就觉得是对的,但是没有严格的证明) dp[i][x]就是在dp[i-1][x-d x+d]中找一个最小值转移,再加上常数|h[i]-x|,这样就可以用优先队列来优化。虽然说是用单调队列来
阅读全文
摘要:用到了kase避免memset超时
阅读全文
摘要:更简单的做法:定义状态dp[i][j]表示在已经用了i根火柴的情况下拼出来了剩余部分(是剩余部分,不是已经拼出来了的)为j(需要%m)的最大长度,一个辅助数组p[i][j]表示状态[i][j]的最高位是往后添加kdp[i][j]=max(dp[i][j],dp[i-c[k]][(j*10+k)%m]
阅读全文
摘要:第k大的题一般都有点麻烦 pbds库的tree,需要研究一下https://codeforces.com/blog/entry/11080find_by_order() and order_of_key(). The first returns an iterator to the k-th lar
阅读全文
摘要:Dreamoon and MRT 题目链接: http://codeforces.com/group/gRkn7bDfsN/contest/212299/problem/B 只需要考虑相对位置,设a0位置为0枚举由于对称性,可以设第一步向右,这样总时间减少一半递归的话省去了cnt部分,直接从O(N2
阅读全文
摘要:见紫书。(c,h)的更新策略://前面的高度为0了,直接插入因为ans c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从左到右扫描一遍 #include<cstdio> #include<cstring> #include<
阅读全文
摘要:每次找到两边离中心最高的板,如果等,再找外围的最高版...画图便于理解两边先找到距离(-1,1)最近的最大值L和R,因为可能存在多个最高的挡板。接着比较两个L和R的大小,相等的话分别分析两边,取最小值注意L和R一边高的话两边都会流,所以这块的时间要乘2。比如分析右边,从最外围开始,顶部画平行线往内部
阅读全文
摘要:单调队列,滑动窗口 int t=0; while(scanf("%d",&n)==1){ if(t) printf("\n"); //有点方便 单调队列用deque很方便 for(int i=1;i<=n;i++){ 维护单调队列 while(!q.empty()&&a[i]<=a[q.back()
阅读全文
摘要:边读入边处理 优化了速度一开始有想错了的地方。处理输入有点想用stringstream, 的问题在于他把字符串连续的数字作为一个整体,遇到空格才分开,所以不适用
阅读全文
摘要:先证明把每次i放到i位置最后次数最少:感觉,可以,用归纳法? //在序列后再加一个相同的序列,就可以模拟用各个数字开头的情况了每个位置不对的只需要换一次54123 ,5固定->41235变成12345 任何一个数固定不变,都相当于从这种情况对应的1所在的位置开始排一遍12345.(例如54123 ,
阅读全文
摘要:贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可。再处理一下空队列的情况。很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成所需时间排序首先队列里的都是能完成的策略:新加入的,如果在前面的完成后仍能完成,就直接加进去;不能,
阅读全文