摘要:
题意:n个人报数,编号从1到n,第一次报m的人出列,以后每数k个数删除一次,问最后出列的人在最开始的时候编号是多少分析:约瑟环问题的变形,链表的方法不行,会tle。其实原题可以认为是第一次删除编号m,然后处理一个规模为n-1的子问题考虑这样一个问题:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2,n-1,0,1,2,... k-2 并且从k开始报0。 现在我们把他们的编号... 阅读全文
摘要:
题意:有6种石头,价值分别是1,2,3,4,5,6 每种有若干,作为输入数据。问能否把这些石头按照价值均分?分析:多重背包问题。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 const int MAXN = 60000 + 5; 6 int dp[MAXN], n[6]; 7 int main(){ 8 int i, j, k; 9 int cas = 0;10 while(scanf("% 阅读全文
摘要:
题意:给出n枚硬币,每个硬币有自己的面值,将这些硬币均分,有时无法均分,求分出来的两份硬币的最小差值分析:统计总面值然后用总面值的一半作为背包容量,01背包。代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #include <string.h> 5 using namespace std; 6 const int MAXN = 50000; 7 const int INF = 0x3f3f3f3f; 8 #define DEBUG 9 in 阅读全文
摘要:
题意:HM先生喜欢吃汉堡,有两种汉堡,每种无限多个,吃完第一种的汉堡一个需要m时间,第二种需要n时间,HM先生饭量很大可以不停的吃,给定一个时间t,在t时间段内希望HM先生吃尽量多的汉堡,并且空余出来的时间要尽量少分析:是一个只有两种元素的完全背包问题。代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 #define DEBUG 6 const int MAXN = 10000 + 10; 7 int d 阅读全文
摘要:
题意:公园在(1,1)点,火车站在(n,m)点,你需要从公园走到火车站,前进时只能距离车站越来越近不能往回走~路上有些地方有障碍(unsafe)不能走,问总的路线有多少。简单的dp,不过dp我是写成函数而不是简答的数组,用a[i][j]=0表示可以走,a[i][j]=1表示不能走。递归调用时注意边界,不要越界。代码:View Code 1 #include <stdio.h> 2 #include <string> 3 #include <string.h> 4 #include <sstream> 5 #include <iostream 阅读全文
摘要:
经典问题了,题意我就不叙述了(题目是中文的~)分析:dp[i][j]表示在第i行第j个位置上能取得的最大和,那么要从最后一行开始算起,到塔顶结束:dp[i][j] = a[i][j]+max(dp[i+1][j], dp[i+1][j+1]), 边界条件是dp[n][j] = a[n][j];代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 #define DEBUG 5 const int MAXN = 100 + 5; 6 int a[MAXN][MAXN 阅读全文
摘要:
题意:手中的硬币币值有1,5,10,25,50共5种,给定一个面值n,问把n兑换成硬币的方案总数是多少。分析:先打表,再输入输出。动态规划的简单题目,设dp[i]表示面值为i的情况下能兑换的种类,那么dp[i]=sigma(dp[i-v[j]]), j=0..4, v[j]={1,5,10,25,50};也就是,如果i大于v[j],说明能够用dp[i-v[j]]的方案再加上一枚面值为v[j]的硬币作为面值i的方案,不过这只是方案中硬币的数量多了一枚,题目中只是问方案数量,那么此时两者在方案数量上等价,那么方案总数上加上这一种情况就可以了。代码:View Code 1 #include < 阅读全文
摘要:
题意:给定n个大写字母组成的字符串,选择尽量多的串,使得每个大写字母都能出现偶数次。分析:暴力枚举O(2n)不行。 采用密码学中的中途相遇攻击原理,用stl的map实现:先取得前一半的判断结果然后后一般在前一半的基础上判断代码:View Code 1 #pragma warning(disable:4786) 2 #include <stdio.h> 3 #include <map> 4 #define DEBUG 5 using namespace std; 6 7 const int MAXN = 24; 8 map<int , int>table; 9 阅读全文
摘要:
题意:给出一个三维的由单位立方体组成的长方体,每个单位立方体有一个值,求这个大的长方体的一个子长方体,使得构成它的单位立方体对应的值之和最大。分析:这是经典问题从一维延伸到三维的情况。画图后就能解决~构造前缀和a[i][j][k]表示以它为右下角的立方体和,然后枚举,复杂度O(n6),这道题目肯定能过。代码:View Code 1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 long long a[21][21][21]; 5 int main(){ 6 int cas, line 阅读全文
摘要:
题意:给出平面上的n个点,找一个矩形,使得边界上包含尽量多的点。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #define DEBUG 5 using namespace std; 6 struct ZZ{ 7 int x, y; 8 bool operator < (const ZZ& p) const{ 9 return x<p.x;10 }11 };12 int max(int a, int b){13 return 阅读全文