
杭电
XD灬
路漫漫其修远兮,吾将上下而求索
展开
-
杭电ACM2571——命运
简单的动态规划,对于每一个位置a[ i ][ j ],从上一个可以到达该位置上的所以位置中找到一个最大值,加上该位置上的数即可。AC代码:#include #include #include using namespace std;int num[21][1005];int dp[21][1005];int main(){// freopen("8.txt",原创 2015-12-21 18:59:46 · 594 阅读 · 0 评论 -
杭电ACM1160——FatMouse's Speed
这题,很明显的动态规划。按照老鼠的重量从小到大排序,重量一样的,按速度从大到小排序。然后进行动态规划,dp[i] = dp[j] + 1;(符合条件的)还有一点比较重要,就是输出的不唯一,样例的 4 4 5 9 7 和 4 4 5 9 8 都是对的。我输出的是4 4 5 9 8下面的AC的代码:#include #include #include #in原创 2015-12-07 23:37:50 · 830 阅读 · 0 评论 -
杭电ACM2501——Tiling_easy version
跟杭电2910一模一样。代码直接copy。#include #include using namespace std;__int64 ans[32];void fun(){ ans[1] = 1; ans[2] = 3; for(int i = 3; i < 32; i++) ans[i] = 2 * ans[i - 2] + ans[i - 1];}in原创 2015-12-05 16:18:19 · 915 阅读 · 0 评论 -
杭电ACM2190——悼念512汶川大地震遇难同胞——重建希望小学
简单的题目,找到递推公式就好了。f(n) = f(n - 2) * 2 + f(n - 1)。(n >= 3)AC 代码:#include #include using namespace std;__int64 ans[32];void fun(){ ans[1] = 1; ans[2] = 3; for(int i = 3; i < 32; i++)原创 2015-12-05 16:12:17 · 740 阅读 · 0 评论 -
杭电ACM1267——下沙的沙子有几粒?
简单的递推题。m >= n时,num[m][n] = num[m][n - 1] + num[m - 1][n]。 添加一个D 添加一个HAC代码:#include #include using namespace std;__int64 num[21][21];原创 2015-12-04 19:43:27 · 379 阅读 · 0 评论 -
杭电ACM1134——Game of Connections
卡特兰数的应用。递推公式为:h(n) = h(n - 1) * (4 * n - 1) / (n + 1).。AC的代码:#include using namespace std;int data[102][100] = {0};void deal(){ int i, j, k = 0; int temp[500]; data[0][0] = 0; da原创 2015-12-04 19:25:06 · 706 阅读 · 0 评论 -
杭电ACM1133——Buy the Ticket
买票问题,m个拿50,n个拿100,买票处没钱找,这m + n这么排才合法。公式: (C(m + n, n) - C(m + n, m + 1) ) * m ! * n ! 化简后 : (m + n)! * (m - n + 1)/ (m + 1). 总的情况 不合法情况 #include #include原创 2015-12-04 12:59:07 · 1166 阅读 · 0 评论 -
杭电ACM1250——Hat's Fibonacci
变型的Fibonacci 数列。采用4位1存。#include #include using namespace std;int num[7200][500] = {0};void add(){ num[0][0] = 0; num[1][0] = 1; num[2][0] = 1; num[3][0] = 1; num[4][0] = 1; int ans = 0;原创 2015-12-04 12:51:44 · 368 阅读 · 0 评论 -
杭电ACM1131——Count the trees
卡特兰数的应用,只是乘多一项 N!下面的是AC的代码:#include #include using namespace std;int data[102][100] = {0};void deal(){ int i, j, k = 0; int temp[500]; data[0][0] = 0; data[1][0] = 1; data[2][0] =原创 2015-12-04 12:49:17 · 407 阅读 · 0 评论 -
杭电ACM3625——Examining the Rooms
今天学到了一个新的数,就是斯特林数,有两类数,这题用到的是第一类斯特林数。这题是斯特林数的应用,这题类似于仓库解锁的问题。斯特林数的递推公式可以在百度百科中找到。#include #include using namespace std;const int N = 22;__int64 S[N][N];__int64 P[N] = {0, 1};void ge原创 2015-11-30 22:58:28 · 349 阅读 · 0 评论 -
杭电1443——Joseph
约瑟夫环问题。枚举直到找到为止。#include using namespace std;int a[14];int main(){ int n; a[1] = 2; for(int i = 2; i < 14; i++) { for(int m = i + 1; ; m++) { int s = 0, j = 2 * i; while(1)原创 2015-11-24 22:22:18 · 711 阅读 · 0 评论 -
杭电ACM1997——汉诺塔VII
判断某种状态是否是正确的。首先判断盘中是否在A柱或者C柱上,在,则说明是正确的。然后判断第N个,是否在A上,在,则A上的准备移到B上,继续递归判断N-1块是否符合,在C上,则说明B上的准备借助A移到C,在B上,则说明是错误的。这样递归调用。#include #include using namespace std;int hanio(int n, int *a, i原创 2015-11-24 20:55:28 · 669 阅读 · 0 评论 -
杭电ACM1568——Fibonacci
巧用数学公式,两边去对数来算。#include #include using namespace std;int main(){ int n; int fib[21] = {0, 1, 1}; for(int i = 3; i < 21; i++) fib[i] = fib[i - 1] + fib[i - 2]; while(cin >> n) { if(n <=原创 2015-11-19 15:41:14 · 746 阅读 · 0 评论 -
杭电ACM1717——小数化分数2
模拟题,百度一下小数化分数的方法,模拟那个过程就OK了。#include #include #include using namespace std;int getIndex(char *str){ int count = 0, i = 0; bool flag = false; while(str[i] != '\0') { if(str[i] == '.')原创 2015-11-18 22:54:47 · 765 阅读 · 0 评论 -
杭电ACM1722——Cake
规律题。#include using namespace std;int gys(int x, int y){ int tx = x, ty = y; int r = tx % ty; while(r) { tx = ty; ty = r; r = tx % ty; } return ty;}int main(){ int p, q; while(c原创 2015-11-15 19:40:44 · 672 阅读 · 0 评论 -
杭电ACM1713——相遇周期
#include #include using namespace std;__int64 gbs(__int64 x, __int64 y){ __int64 tx = x, ty = y; __int64 r = x % y; while(r) { x = y; y = r; r = x % y; } return tx / y * ty;}__int6原创 2015-11-15 17:09:19 · 1081 阅读 · 0 评论 -
杭电ACM2138——How Many Prime Numbers
#include #include using namespace std;int cheakprime(int x){ int i, k = sqrt(x); for(i = 2; i <= k; i++) { if(x % i == 0) return 0; } return 1;}int main(){ int n, ans, a; while(ci原创 2015-11-15 14:46:45 · 395 阅读 · 0 评论 -
杭电ACM3117——Crixalis's Equipment
贪心。一个是设备静止的体积,一个是移动的体积。问所以设备能不能进洞。#include #include using namespace std;struct data{ int a, b, c;};int cmp(data a, data b){ return a.c > b.c;}int main(){ data D[1005]; int t, v, n,原创 2015-11-14 22:31:09 · 352 阅读 · 0 评论 -
杭电ACM2550——百步穿杨
#include using namespace std;int main(){ int i, j, t, n, a[55], b[55]; cin >> t; while(t--) { cin >> n; for(i = 0; i < n; i++) cin >> a[i] >> b[i]; for(i = 0; i < n - 1; i++) { i原创 2015-11-13 23:30:32 · 907 阅读 · 0 评论 -
杭电ACM2719——The Seven Percent Solution
#include #include using namespace std;int main(){ char str[100]; while(gets(str)) { if(str[0] == '#') break; int length = strlen(str); for(int i = 0; i < length; i++) { switch(st原创 2015-11-13 23:28:07 · 372 阅读 · 0 评论 -
杭电ACM2109——Fighting for HDU
水题。#include #include using namespace std;int main(){ int n, i; int a[105], b[105]; while(cin >> n && n) { for(i = 0; i < n; i++) cin >> a[i]; for(i = 0; i < n; i++) cin >> b[i];原创 2015-11-13 23:24:08 · 799 阅读 · 0 评论 -
杭电ACM2111——Saving HDU
简单的贪心,需要注意的是给的价格是单价。#include using namespace std;int main(){ int v, n, i, j; int price[105], vol[105]; while(cin >> v) { if(v == 0) break; cin >> n; for(i = 0; i < n; i++) cin >>原创 2015-11-13 22:50:35 · 276 阅读 · 0 评论 -
杭电ACM1527——取石子游戏~~威佐夫博奕
这道题目,就是威佐夫博奕问题。所谓的威佐夫博奕问题就是:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。百度百科中 有详细的论述和证明:http://baike.baidu.com/link?url=YPnShzGoLN4Te1qsPR1FSus9amYbk6HZqMx8__nf_TQ0AE0Lu-A6863I1B原创 2015-09-17 16:25:03 · 550 阅读 · 0 评论 -
杭电ACM2059——龟兔赛跑~~DP
对于DP,还不是很熟。需要加强!!~~说一下这道题,由于兔子是匀速的,所以兔子到达终点的时间是确定的,唯一不确定的是乌龟的。将起点,终点,以及中间的N个充电站当作N + 2 个点。需要求解到达N + 2个点的最优解。起点时间是0.这是必须的,然后往后面DP到第i个,就让j从0循环到i-1,依次代表从j站充满了电一直开到i站,这样得到到达i站所需要的最短时间。最后比较到达第n+2原创 2015-09-06 20:33:10 · 4150 阅读 · 2 评论 -
杭电ACM1501——Zipper~~DFS
题目的意思是:给你三个字符串,判断第三个字符串是否是前面两个字符串组成的,且前面两个字符串的字符在第三个字符串中的顺序不变。可以用DP 或者 DFS。我用的是DFS,需要一个二维数组来存在各个状态是否访问过,访问过的就可以直接跳过,也就是记忆化搜索。下面的是AC的代码:#include #include using namespace std;char str1[2原创 2015-08-24 17:33:33 · 1034 阅读 · 0 评论 -
杭电ACM1372——Knight Moves~~BFS
题目的意思是:国际象棋的棋盘的列是 a ~ h ,横向是 1 ~ 8 。问一个骑士葱一个位置上到另外一个位置上的最少的步数。国际象棋的骑士的走法跟中国象棋的马的走法一样,所以,一个位置上,有8个位置可以走。将走过的点标记为不可走,通过BFS可以求出。下面的是AC的代码,有注释:#include #include #include using namespace std;i原创 2015-08-23 15:48:33 · 928 阅读 · 0 评论 -
杭电ACM1431——素数回文~~打表法
如题目,求a 到 b 之间的回文素数。b最大为10^8。暴力的方法,会超时,所以求素数用埃式筛选法。由于筛选10^8之间的素数,也会超时,所以,为了降低所需的时间,就用暴力的方法算出最大的回文素数为9989899。所以,我们只需要找10^7之间的素数,然后根据素数表,找出是回文的素数。下面的是AC的代码:#include #include using namespace std原创 2015-08-22 21:06:27 · 1454 阅读 · 0 评论 -
杭电ACM1425——sort~~水题
如题目,很简单,直接sort函数暴力过下面的是AC的代码:#include #include #include using namespace std;int num[1000005];int main(){ int m, n; while(scanf("%d%d", &m, &n) != EOF) { for(int i = 0; i < m; i++) {原创 2015-08-22 20:13:54 · 1638 阅读 · 1 评论 -
杭电ACM1394——Minimum Inversion Number
题目的意思:给你一个数组,求最小的Inversion Number。所谓的Inversion Number是 数组中 i a[ j ] 的对数。数组可以滚动,也就是相当于环状的,每一个数都可以当作起始位置。这题,暴力可以直接过,接近300MS。下面的是AC的代码:#include #include using namespace std;int D[5005];i原创 2015-08-07 22:38:26 · 657 阅读 · 0 评论 -
杭电ACM1302——The Snail
题目的意思是:一只蜗牛要爬出井,井高度为H,白天它可以爬U,晚上会掉下来D,白天爬的会比前一天少F% * U。问蜗牛爬出井需要的天数,或者落回井底的天数。题目的意思很明确,模拟一下就可以AC了,很简单。下面的是AC的代码:#include using namespace std;int main(){ int i, flag; double H, U, D, F,原创 2015-08-07 21:44:04 · 575 阅读 · 0 评论 -
杭电ACM1074——Doing Homework~~状态压缩DP
题目的意思:N门课程有作业,一个时间是最迟交的时间,一个是需要耗费多少时间来完成,到了期限,迟交多少,就扣多少分,求扣最少分的做作业的顺序。N小于等于15,可以枚举所以的情况,数的二进制来表示各种情况。对于集合编码成整数,可以看我的另一篇博客:点击打开链接原创 2015-07-28 20:23:42 · 1231 阅读 · 0 评论 -
杭电ACM1284——钱币兑换问题
一开始,以为是一个简单的高精度加法的问题。推出的递推公式是:F(n) = F(n - 1) + F(n - 2) + F(n - 3)。但是,事实上,这个递推公式是错的,存在重复的情况。正确的递推公式是:F(n) = F(n - 3) + n / 2 + 1。 F(n - 3) 是加上一个3分的情况,n / 2是兑换的钱中有2 的情况,1是兑换的全是1的情况。对于这个递推公式,将原创 2015-07-27 20:03:25 · 1255 阅读 · 0 评论 -
杭电ACM1282——回文数猜想
如题,题目很简单,水题一个。输入一个数,判断是否是回文数,是就退出,中间的值用数组记录。将数倒序,判断与原来的数是否相等,相等就是回文数。由于数不超过int型,所以可以用下面的来来判断。int cheak(int n){ int temp = n; int ans = 0; while(temp) //不断的取temp的最后一个数加到ans上,就将n转置过来原创 2015-07-27 19:45:44 · 812 阅读 · 0 评论 -
杭电ACM2665——Kth number~~划分树
题目的意思:给点区间[a, b],查找第K大的数,和POJ2104题一样,只是HDU上的时间限制5000MS,用我在POJ上的方法,过不了,会超时。而这一题的代码,改一下main函数的输入,就可以直接AC了POJ上的2104.这题,用分桶法,WR,纠结了一晚上,最后还是放弃了,实在不知道错在哪里。于是改用了划分树的方法,学习了划分树的建立和查找。划分树:主要运用于求解序列中区间[a,原创 2015-07-25 14:16:39 · 799 阅读 · 0 评论 -
杭电ACM2094——产生冠军~~拓扑排序
题目的意思,如题。很容易明白。解决的方法就是拓扑排序,就可以很容易的解决了。每输入一对选手,判断两个选手是否出现过,没有出现过,新建一个头结点,加入到邻接表中,更新结点的入度。最后判断是否存在一个结点的入度为0,有,则Yes,否则No。我用的是STL中的list容器来创建的邻接表。下面的是 AC的代码:#include #include #include using原创 2015-07-23 23:26:25 · 1367 阅读 · 0 评论 -
杭电ACM1277——全文检索~~AC自动机算法
题目的意思:给你一篇文章,再给你T个字符串,判断这T个字符串有哪些在文章中出现过。由于文章很大,普通的方法必定超时,所以需要用 AC自动机算法。AC自动机算法是多模匹配算法之一,主要是用于在一篇文章中,找出给定的N个单词在这篇文章中出现的个数。AC自动机算法,我也是刚刚学习,主要是在建立字典树的基础上,增加了失败指针,提高了匹配的效率。而且最难的是失败指针的建立。它的优点是:最大限原创 2015-07-22 22:42:39 · 761 阅读 · 0 评论 -
杭电ACM1570——A C~~水题
无聊,刷刷水题。题目很简单,求排列或组合,n和m最大10.直接普通的办法0MS过了。下面的是 AC的代码:#include using namespace std;int f(int n){ int ans = 1; for(int i = 2; i <= n; i++) ans *= i; return ans;}int main(){ int n, m,原创 2015-07-22 19:27:03 · 701 阅读 · 0 评论 -
杭电ACM2086——A1=?
题目的意思很容易明白:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).若给出A0, An+1, 和 C1, C2, .....Cn.请编程计算A1 = ?根据方程:Ai = (Ai-1 + Ai+1)/2 - Ci 可以写出:A1 = 1/2 * A0 + 1/2 * A2 - C1;.........原创 2015-07-22 19:01:51 · 2619 阅读 · 1 评论 -
杭电ACM1238——Substrings
题目的意思是,找到各个串的最长子串,输出长度。我们找到最短的串,枚举这个串的所有子串,需要注意的是,这些子串的逆序也是可以的。知道了这些,就可以写出代码了。下面是AC的代码:#include #include using namespace std;char str[105][105];int main(){ char s1[105], s2[105]; int原创 2015-07-20 22:43:19 · 1070 阅读 · 0 评论 -
杭电ACM1124——Factorial
题目的意思是:求N!的尾部有多少个零。刚开始讲的全是废话,在问题描述的最后一段才看懂了题目要干嘛。求N!的尾部有多少个零,先算出N!,再来一个一个数,是不可能的,而且N最大达到了100000000。而我们需要从数学的角度来分析一下,0是怎么产生的?通过写出前面几个数的阶乘,可以知道,想要产生0,就必须要有5以及一个偶数来跟它相乘。而我们可以知道的是,一个数的阶乘中,5的个数远远小于偶数原创 2015-07-19 13:22:30 · 901 阅读 · 0 评论