IT民工
加油!
上一页 1 2 3 4 5 6 7 8 ··· 29 下一页
摘要: 一道树形DP+01背包的题。用dp[k][j]表示以k的根的树用j天最多可以得到多少宝藏,m是天数限制,因为要往返,所以将m/2以后就可以直接计算单程的值了。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>///dp[k][j]表示以k的根的树用j天最多可以得到多少宝藏using namespace std;const int MAXN = 105;int e;int n, k, m;int first[MAXN], next[MAXN < 阅读全文
posted @ 2012-09-12 11:26 找回失去的 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题目给出的是一个环状的序列,所以可以在序列后面复制前k个数字。如果用sum[i]来表示复制过后的序列的前i个数的和,那么任意一个子序列[i..j]的和就等于s[j]-s[i-1]。对于每一个j,用s[j]减去最小的一个s[i](i>=j-k+1)就可以得到以j为终点长度不大于k的和最大的序列了。将原问题转化为这样一个问题后,就可以用单调队列解决了。单调队列确实是一种很实用的结构,本题中保持单调递增,队首元素就是我们需要的那个最小元素,保证待插入的j-1位置对应的sum值要大于队尾元素。#include <stdio.h>#include <string.h>#in 阅读全文
posted @ 2012-09-12 09:56 找回失去的 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 这道题思路不难,用01背包的思想来解这道题,一个M的背包装N个物品,这N个物品的权值和体积都是vi,很简单的一个模型,直接用背包的方法解的话,不止会超内存,而且会超时,这样WA了一遍之后寻求另一种写法。然后就用深搜加剪枝过了这道题。排序后从大的取起。/*Accepted 180 KB 0 ms C++ (g++ 4.4.5) 795 B 2012-09-11 16:03:06*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using nam 阅读全文
posted @ 2012-09-11 16:09 找回失去的 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 这是昨天网络赛的1002题,做得很伤感。昨天处理的方法上有些错误,一直没有过。今天学习了下set,STL真强大。将Alice的card标记为id=0,Bob的card标记为1。将所有的纸片按照h,w的升序排序,按照id的降序排序,也就是在相同情况下将Bob的纸片放前面。然后将Bob的纸片的w插入set,贪心选取Alice比Bob的纸片w大一点的来覆盖,然后删掉被覆盖的纸片。#include <stdio.h>#include <string.h>#include <algorithm>#include <set>using namespace s 阅读全文
posted @ 2012-09-09 10:37 找回失去的 阅读(740) 评论(2) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1005;int fib[MAXN], e[MAXN], h[20];void calcFib(){ int i; fib[1] = 1, fib[2] = 2; for(i = 3; i <= 16; i ++) { fib[i] = fib[i - 1] + fib[i - 2]; }}void calcE(){ int i, j, k; e[0] = 0, e[1] = 1; for(i ... 阅读全文
posted @ 2012-09-06 17:27 找回失去的 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 当对手面对3的时候,你就已经赢了,所以,尽可能的给对手剩下3,那么只要n是3的倍数就是Cici赢,不是的话,Kiki会想办法给Cici留下3。#include<stdio.h>int main(){ int n; while(scanf("%d", &n) == 1) { puts(n % 3 == 0 ? "Cici" : "Kiki"); } return 0;} 阅读全文
posted @ 2012-09-06 14:20 找回失去的 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 简单博弈,记得小学数学课上也有这个类似的问题,只不过每次只能取1到2个,问取到30谁能赢。答案是后取的人赢,因为每次都能凑成3,所以后取的人采用这种策略就不会输。这道题呢,每次凑m+1,如果能被n整除,那么第二个人就能赢,如果不能,那么第一个人可以采用策略使剩下的石子数能被m+1整除,然后按照第二个人之前的策略就能赢。#include<stdio.h>int main(){ int a, b, t; scanf("%d", &t); while(t --) { scanf("%d%d", &a, &b); a = a 阅读全文
posted @ 2012-09-06 14:03 找回失去的 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 数论的题做的很少,这道题本来不难,结果在五个小时内还是没做出来。所有a[i]分解质因子,并累计0到100中所有质因子出现的次数存入num数组中。X!要能被M整除,那么在M中出现的所有的质因子就应该在x!中出现并且出现的次数不少于在M中出现的次数。然后二分答案。有一个计算公式:LLcal(LLi,LLx){LLret=0;while(x){x/=i;ret+=x;}returnret;}可以求出i在X!中出现的次数。/*Accepted 3641 0MS 252K 1461 B C++ Yu*/#include<stdio.h>#include<string.... 阅读全文
posted @ 2012-09-05 16:13 找回失去的 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题目蛮有意思的,有n头牛进行比赛,他们之间的比赛结果可以传递,比如a战胜了b,b战胜了c,那么也可以推出a战胜了c,问有多少头牛的名次可以确定。名次确定就是它战胜的x头牛+战胜它的y头牛=n-1,出现这种情况+1即可。今天的开胃菜。。。/*Accepted 228K 32MS C++ 1056B 2012-09-03 09:46:55*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 7;int res[MAXN][MAXN];int n, m; 阅读全文
posted @ 2012-09-03 10:03 找回失去的 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 和POJ1840有点像,但这里只需判断有没有解,一个简单的hash就可以搞定,以后不能滥用vector,自己手写邻接表。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>typedef __int64 LL;const int MAXN = 205;const LL prime = 1000007;int head[prime + 3], e, next[MAXN * MAXN];LL val[MAXN * MAXN];LL s1[MAXN], s2[MAXN 阅读全文
posted @ 2012-08-25 16:51 找回失去的 阅读(195) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 29 下一页