摘要:
题意: 给N个人依次分卡片,然后从的第一个人到最后一个人依次拿走全部的卡片,问最少经过多少次,可以使得卡片回复到原来的次数。分析:求出每个卡片循环到原来位置的最少次数,在一个循环节中,每个卡片的循环次数相同,求出这些循环次数的最小公倍数即可,(输入要用%I64d,用%lld wa了好长时间)#include<stdio.h>#include<string.h>#define maxn 1000long long next[maxn];long long a[maxn];long long gcd(long long x, long long y){ if(!x||!y) 阅读全文
摘要:
题意: 给出一个有N 个节点,和M 条边,这些边分为 蓝色和红色的,问是否存在一种情况为 恰好用 k个蓝色的边,和已有的若干条红色边,将原图连成一棵树。分析: 两次 Kruskal ,第一次的时候先把能用的红色边全部用上,然后用蓝色边,这些用到的蓝色边都是最终的生成树所必需的,将其标记如果发现需要的蓝色边数目大于 K,或用完了能用的蓝色边之后图还未连通,则不存在符合条件的情况 第二次Kruskal的时候,先把之前标记的蓝色边全部用上,然后在剩下的蓝色边选出能用的边,如果总数能达到K则存在符合的情况。#include<stdio.h>#include<string.h># 阅读全文
摘要:
题意: 知道了汉诺塔的一个状态,求把全部汉诺塔移动到B上的步数。分析: 逆向推即可。#include<stdio.h>#include<string.h>char str[100] ;long long calc(char A, char B, char C, int n){ if(n==0) return 0 ; if(str[n-1]==B) return calc(C,B,A,n-1) ; if(str[n-1]==A) return calc(A,C,B,n-1)+(1LL<<(n-1));}int main (){ ... 阅读全文
摘要:
题意: M2%10x=N ,给出n值,找到满足等式的最小m值,x=(0,1,2...)。分析: 由于M的位数不可能超过n的位数,可以从n的最后一位开始逐位搜索。#include<stdio.h>#include<string.h>const __int64 INF=999999999;__int64 num[25];__int64 min(__int64 a,__int64 b){ return a<b?a:b;}__int64 ans,n;int top;__int64 p;void dfs(int pos,__int64 w,__int64 res){ if( 阅读全文
摘要:
题意: 给两个数组,求最长公共递增子序列。分析: dp[i,j]表示a串前i个字符,b串前j个字符组成的,并且以b[j]为结尾的最长的LCIS,转移方程: dp[i,j]=dp[i-1,j]; //a[i]与b[j]不等 dp[i,j]=dp[i-1,k]+1; (1<=k<=j-1) //a[i]与b[j] 相等 以上转移方程是O(n^3)时间复杂度 优化: 由于最外层循环是 i,第二层是 j,循环 j 的时候,实际上同时找出dp[i-1,k] 的最大值MAX 方法:循环 j 的同时,若a[i]>b[j],更新MAX (因为当且仅当a[i]>b[j]时,后边循环 j 阅读全文
摘要:
题意: 有N件商品,知道了商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间,求出最大利润。分析:利用并查集按利润排序,建立一个关于时间的并查集 每次插入一个物品时,若该物品时间为 i,找出find(i),记为t,若t不为0,则将该物品安排到t这个时间完成,并使f[t]=t-1 亦即对于每个物品尽量 安排在后边完成,安排后将fa指针前移,表示这个时间已经被占用,下次需要插入到它之前。#include<stdio.h>#include<string.h>#include<algorithm>#define cl 阅读全文