随笔分类 -  00 . . |解题报告

HYSBZ 1026: windy数(数位DP)
摘要:类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。问[A,B]之间windy数的个数。(1 #include #include using namespace std;int num[100];long long dp[20][10][2];long long dfs(int i, int d, bool preAllZero, bool isQuery) { if (!isQuery && ~dp[i][d][preAllZero]) return dp[i][d][preAllZero]; if (i == 1) { return... 阅读全文

posted @ 2014-03-11 23:53 ShineCheng 阅读(416) 评论(0) 推荐(0)

HDU 3652:B-number(数位DP)
摘要:亮点:收获:降一些时间复杂度可能带来编程复杂度。如果编程复杂度太高,而且时间允许的话,试着用一些冗余的状态来降低编程复杂度。查询和正常DP的差别就在于:查询的时候有限制(最大不能超过那个数),而正常的时候没有类型:数位DP题意:找1~n内有多少能被13整除且含“13”这个子串的数。方法:(我的,想的比较乱的方法)dp[i][d][mod] 表示d开头的i位数中含有“13”这个子串且%13==mod的数的个数则:那么下一个余数nextMod = ((mod-j*10i-1)%13+13)%13dp[i][d][mod] = 1) d != 1: ∑dp[i-1][j=(0~9)][nextMo. 阅读全文

posted @ 2014-03-11 22:01 ShineCheng 阅读(256) 评论(0) 推荐(0)

HDU 3555: Bomb (数位DP)
摘要:类型:数位DP题意:求1~N内,含有49这个子串的数的个数。N#include #include using namespace std;long long dp[100][10];int num[30];void init() { for (int i = 0; i >N; long long ans = 0; long long tmp = N; int len = 0; while (tmp) { num[++len] = tmp%10; tmp/=10; } ... 阅读全文

posted @ 2014-03-10 16:42 ShineCheng 阅读(190) 评论(0) 推荐(0)

UPC 2219: A^X mod P
摘要:题形:另类快速幂题意:f(x) = K, x = 1f(x) = (a*f(x-1) + b)%m , x > 1Now, Your task is to calculate( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P. 1 #include #include long long n, A, K, a, b, m, P;long long p1[100005], p2[100005];int main() { int t; scanf("%d", &t); int cas = 阅读全文

posted @ 2014-03-09 20:41 ShineCheng 阅读(246) 评论(0) 推荐(0)

ZOJ 2619: Generator
摘要:类型:概率 + 解方程组(高斯消元法) + KMP(好吧其实我用的是暴力~)题意:你可以等概率的选择大写字母里的前n个字母,在纸上写啊写,一直到出现给定的字符串。问写的字母个数的期望。思路:期望递推法。(不过这里推出了个环……)下一个状态是看现在这个串,加上一个字母之后,能匹配到原串的哪里。(就是KMP里面的失配数组,写字符串的过程,就是一边写一边匹配)不过我KMP不太熟悉,就直接暴力了。。推完后发现,推出了一个环。怎么办,只能用高斯消元法来解这个方程组了。这题比较特殊,经过证明(我不会= =)可以得到,答案必定为整数。高斯消元法用double精度卡死(样例都过不了),用分数还是WA(可能溢出 阅读全文

posted @ 2014-03-08 21:18 ShineCheng 阅读(380) 评论(0) 推荐(0)

UVA - 10288 Coupons
摘要:题形:概率DP题意:收集齐n个不同的优惠卷的期望开箱次数。(开一次箱子会等概率的得到其中一张优惠卷)思路:期望递推法。正常做就行。就是分数输出麻烦了点。e[i] = i/n(e[i]+1) + (n-i)/n(e[i+1]+1)然后移项,递推就行了。代码:#include #include #include #include using namespace std;#define N 50 struct fraction { long long numerator; // 分子 long long denominator; // 分母 fraction() { ... 阅读全文

posted @ 2014-03-07 16:15 ShineCheng 阅读(339) 评论(0) 推荐(0)

POJ 1722: SUBTRACT
摘要:题形:DP,背包题意:有一个数组,里面保存着n个数。con(i) 操作表示 把a[i] 和 a[i+1] 这两项 用 a[i]-a[i+1]这一项取代(所以操作结束后数组长度会减少1)。通过n-1次操作,可以让数组只剩下一个数。给你一个目标数,求n-1次操作,使得经过这些操作之后这个数组能变成这个目标数(题目保证存在解)思路:题目拐了个大弯啊~隐藏的真好。需要转换模型。首先,容易把题意转变成,a[1]-a[2]-a[3]-...-a[n],这样一个算式,让你加括号,使得结果为目标数然后想象一下最后的答案。假设我们知道最后的答案,那么把所有括号拆掉,结果的式子一定一这样的:a[1]-a[2]&# 阅读全文

posted @ 2014-03-06 18:41 ShineCheng 阅读(417) 评论(0) 推荐(0)

Vijos 1323: 化工厂装箱员
摘要:题形:DP题意:A,B,C三种物品,一共N个,顺序摆放,按顺序拿。每次手上最多能拿10个物品,然后可以将某个类别的物品分类放好,再从剩下的拿,补全10个。问最少放几次,可以把所有物品分类好。思路:第一次见这种DP.……感觉应该是宽搜求最短路吧?好奇怪dp[i][a][b][c] 表示 拿到第i个物品,手上剩A物品a个,B物品b个,C物品c个,这个状态时,所用的最少的次数。假设我们这次拿A,则dp[i+a] [sum['A'][i+a]-sum['A'][i]] [b+sum['B'][i+a] - sum['B'][i]] [c+ 阅读全文

posted @ 2014-03-06 14:08 ShineCheng 阅读(195) 评论(0) 推荐(0)

CodeForces 385D: Bear and Floodlight
摘要:类型:DP,计算几何题意:坐标系上有(l,0)~(r,0)一条直线,是一条路。然后还有其他一些点,这些点上有灯,灯能照一定的角度,需要用这些灯照亮那条路,问起点开始最远一直能照到哪。思路:状态压缩DP.dp[1111..1] = max(遍历所有灯,那个被去掉的灯,从dp[11..0..11]这点开始照,最远照到哪)就是求计算几何有点不会诶。。。。与出现顺序有关的问题,可以用状态DP,从N!降到2N。我的代码:#include #include #include #include using namespace std;#define N 22const double eps = 1e-8;c 阅读全文

posted @ 2014-03-05 21:44 ShineCheng 阅读(205) 评论(0) 推荐(0)

UVA - 10050 Hartals
摘要:#include #include int parry[110];int nowparry[110];int main() { int t; scanf("%d", &t); while (t--) { int n; int p; scanf("%d%d", &n, &p); for (int i = 0; i < p; i++) { scanf("%d", &parry[i]); nowparry[i] = 0; } int cnt = 0; ... 阅读全文

posted @ 2014-03-05 14:06 ShineCheng 阅读(127) 评论(0) 推荐(0)

SGU 495: Kids and Prizes
摘要:类型:概率DP题意:有N个箱子放有礼物,M个人依次取。如果取到的箱子有礼物,则拿走礼物。无论有没有拿到礼物,都将箱子原状放回。(所以就有可能后面的人拿到前面的人拿过的箱子,然后就没得到奖品)。问,主办方期望送出的礼物数量。思路:思路一:期望递推法。期望是理想值。可以理解成,在理想状态下,做期望数次,一定,也是恰好,能完成这件事。为什么能这么想?在现实中显然是不成立的,但是我们是做题目,求的是一个理想的值,也就是说我们是在一个理想的环境中,所以可以用这种理想化的想法。那么这道题目就是:设dp[i] 表示i个人拿过以后,主办方送出礼物的期望数量。那么,对于第i个人,可能拿到,也可能没拿到礼物,转移 阅读全文

posted @ 2014-03-04 16:51 ShineCheng 阅读(207) 评论(0) 推荐(0)

CodeForces 148D: Bag of mice
摘要:类型:概率DP题意:袋子里有黑球白球,公主和恶龙依次从里面拿。公主先。恶龙拿的时候,会额外掉出去一个(这个不参与胜负评判)。谁先拿到白球谁胜利。如果都拿完了都没人拿到,则判定恶龙胜。思路:如图代码:#include #include double p[1004][1004];int main() { int w, b; while (scanf("%d%d", &w, &b) != EOF) { //其实可以放到外面只初始化一次 for (int i = 0; i = 3 && j >= 2) { double re... 阅读全文

posted @ 2014-03-04 12:10 ShineCheng 阅读(184) 评论(0) 推荐(0)

HDU 4405: Aeroplane chess
摘要:类型:概率DP题意:一条直线下飞行棋,色子六个面等概率。同时存在一些飞机航线,到了某个点可以直接飞到后面的另一个点,可以连飞,保证一个点至多一条航线。求到达或者超过终点 所需要 掷色子的期望次数。思路:如果可以飞,那么从这个点到终点的期望次数 等于 飞到的那个点 到终点的期望次数。 否则,就是掷一次色子,然后后面六个点到终点的期望次数 求平均 +1;换种表示:if (canFly) dp[now] = dp[flyTo];else dp[now] = (dp[now+1]+dp[now+2]+...+dp[now+6]) / 6;代码:#include #include #define N 1 阅读全文

posted @ 2014-03-03 23:42 ShineCheng 阅读(147) 评论(0) 推荐(0)

HDU 4336: Card Collector
摘要:题形:概率DP题意:有n个物品,和得到每个物品的概率。问收集齐所有物品的期望次数。思路:面对一个局面,我们都考虑 拿一次 以后 会怎么样?对于一个物品:E = p*1 + (1-p)*(1+E); 期望 我这一次拿到了 我这一次没拿到,还需要拿(1+E)次 (这里的1 代表这次, E表示以后还要拿E次)对于两个物品:E__ = p1*(1+E1_) + p2*(1+E_2) + (1-p1-p2)*(1+E__) 解释第一项:我这次拿到了1,那到1以后我还需要拿 E1_ 次,所以 p1 的概率 我需要拿 1+E1_次额。。看不懂继续百度吧。然后这里用状态压缩DP完成坑点: 递归超时,... 阅读全文

posted @ 2014-03-03 23:10 ShineCheng 阅读(164) 评论(0) 推荐(0)

UVA - 10196:Check The Check
摘要:类型:简单模拟大致题意:已知国际象棋行棋规则,给你一个局面,问是否将军?谁将谁的军?(保证不会同时将军)思路:都以小写字母 测试 是否将 大写字母。 然后一个局面测两次(一次直接测,一次反转棋盘,同时大小写互换,测)原题:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21173The ProblemYour task is to write a program that reads a chess board configuration and answers if there's a king under at 阅读全文

posted @ 2014-03-03 12:16 ShineCheng 阅读(410) 评论(0) 推荐(0)

POJ 2577: Interpreter
摘要:简略解题报告DescriptionA certain computer has 10 registers and 1000 words of RAM. Each register or RAM location holds a 3-digit integer between 0 and 999. Instructions are encoded as 3-digit integers and stored in RAM. The encodings are as follows: 100 means halt 2dn means set register d to n (between 0 a 阅读全文

posted @ 2014-03-03 00:17 ShineCheng 阅读(386) 评论(0) 推荐(0)

CodeForces 380.C Sereja and Brackets
摘要:题意一串括号序列,只由(和)组成,然后是m个提问,提问l和r区间内,最大的匹配匹配括号数。思路第一,贪心的思想,用最正常的方式去尽量匹配,详细点说就是,先找到所有的(),然后删除这些(),再找所有的()。用这种方式匹配出来的,就是最优的方案。第二,如果我们把所有的'('当成+1, ')'当成-1, 然后画成函数,那么,我们可以通过函数的图像,来得到得到,这段区间的长度(r-l),这段区间的最小值(min),这段区间没用的')'的数量(f(l)-min),这段区间没用的'('的数量(f(r)-f(l)+(f(l)-min)) 然后就 阅读全文

posted @ 2014-01-14 23:39 ShineCheng 阅读(548) 评论(0) 推荐(0)

POJ 2796: Feel Good
摘要:题意:一个数组,对于某个区间,这个区间的和*这个区间中的最小值=这个区间的计算值。求这个数组中的最大计算值,并任意输出其的一个左右位置。思路:维护一个最小单调栈。对于某个元素:如果被弹出了,说明它最多向右延伸到这里。对于进栈,如果它的进栈没有造成任何元素的弹出,则说明它的位置就是它左边能延伸到的位置。如果造成元素弹出,那么,最后一个弹出的元素的左边能延伸到的位置就是本元素往左能延伸到的位置。对于两个元素相同时:我不作弹出处理,仅仅把这个元素的位置更新(代码中表现为把这个元素往左延伸的和更新)。在弹出元素时,能求和,而这个和正是元素往右延伸的和。往左延伸的和已经算好,所以这个元素为最小值的最大区 阅读全文

posted @ 2013-12-03 23:26 ShineCheng 阅读(616) 评论(0) 推荐(1)

TopCoder SRM596 DIV2 1000: SparseFactorialDiv2
摘要:题意:For an integer n, let F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2), where k is the largest integer such that n - k^2 > 0. You are given three long longs lo, hi and divisor. It is guaranteed that divisor will be a prime number. Compute and return the number of integers 阅读全文

posted @ 2013-11-03 15:52 ShineCheng 阅读(408) 评论(0) 推荐(0)

HDU 4768: Flyer
摘要:题意:有N个社团,每个社团三个属性A,B,C,表示会向编号A+k*C的同学发传单(k=0,1,2... && A+k*C #include #include #include #include #include #include using namespace std;int n, a[100001][3];long long sum;bool check(int now){ long long sum = 0; for (int i = 1; i = a[i][0]) { int Right = min(a[i][1], now); ... 阅读全文

posted @ 2013-09-28 20:13 ShineCheng 阅读(304) 评论(0) 推荐(0)

导航