随笔分类 -  算法

摘要:这个算是脱了很久很久的一片解题报告了。主要是运用动态规划求解期望问题的解法,一般用记忆化搜的写法更好理解。以几个题为例:UVALive 5811,Card。题意很简单:一副扑克牌共有13张黑桃,红心,梅花,方片和大小王各一张,input会给出黑桃,红心,梅花,方片的数量。问从随机分布的一堆牌中依次抽取一张牌,达到题中所要求的数量,至少需要抽取牌的期望,如果抽到大小王,则可以把它们当成任意花色,因为要求抽取的牌数最少,所以当然是当成最需要的了。比赛训练时想了很久,都没有想出来,最后还是看了大牛的代码才略懂一二。主要是用dp值表示期望,记忆化搜直接出解,dp[a][b][c][d][big][sm 阅读全文
posted @ 2012-10-07 11:42 celia01 阅读(323) 评论(0) 推荐(0)
摘要:练比赛的时候uva挂了,所以整场比赛都没怎做,不过作为一个做队里数学的人,当时没很快的给出解法真是太蒟蒻了。题意很简单,是纳税的模型,每个人薪水根据阶段纳税,小于s1的部分不纳税,s1至s2部分按0.1纳税,大于s2的按0.2纳税。题中每组case给出这个人的薪水,和一段区间[min,max],s1与s2平均分布在区间[min,max]中,问这个人平均纳税值的期望。其中min,max都是整数,s1,s2也要求是整数You should assume that all distinct combinations of S1 and S2 satisfying the above conditio 阅读全文
posted @ 2012-08-18 20:16 celia01 阅读(346) 评论(0) 推荐(0)
摘要:Sample InputOutput for Sample Input32 2sohelH-CSE samee-CSE4 2Blind-ECS sidky-CSE muntasir-CSC ShadowCoder-EEE4 2ABC-D1 DEF-D1 ghi-D2 jkl-D3Case 1: 0Case 2: 24Case 3: 16题意:给出n个人与这些人分别所属的公司,其中属于同一家公司的人不会超过3个人。将n个人任意排列(即有n!)中情况,按顺序将任意排列的n个人,每k个人一组(保证n%k==0),问满足每组不会有相同公司人的排列有多少个?比赛的时候一直没往DP方面想,后来发现确实是一 阅读全文
posted @ 2012-08-18 20:04 celia01 阅读(216) 评论(0) 推荐(0)
摘要:后来看了07年周泽(大概是?)的论文,才知道原来这个是一个很经典的单调队列题。题意:给出一个长度为n序列,每次将第一个元素移至最后可以得到有n种序列,问其中有多少个满足对于所以的i(1≤i≤n),sigma(a[k]),(1≤k≤i)>=0,就是可以维护一个递增的序列,这样每次取队首就O(1)的求出是否满足条件了,维护序列只需要O(n)的复杂度。比赛的时候用dp思想的st(rmq)的O(nlogn)的算法超时了,后来知道原来有一种RMQ转换为LCA,又转化为RMQ的算法可以做,这样复杂度也可要跟单调队列的做法一样,转换为O(n)。这类单调队列的基本做法吧。比较习惯的写法:l=0; r=- 阅读全文
posted @ 2012-08-18 19:44 celia01 阅读(505) 评论(0) 推荐(0)
摘要:题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1967题意:多case,有两个集合Ga和Gb,两个集合最开始都有S个元素,可以将Ga中的元素移动到Gb中,也可以将Gb中的元素移至Ga中,每次移动的花费为移动前两集合中元素个数之差的绝对值,在保证花费不超过最大花费C的情况下,使Ga中最小的元素-Gb中最大的元素的值最大,化成式子就是求Max{min{Ga}-max{Gb}}。应该算是贪心吧,想了很久,推出了个结论过了,不过后面要用到二分,不过数据弱,不用二分也能过,正解应该要用二分查找的,不过写二分到是写苦了我,这次顺 阅读全文
posted @ 2012-08-11 14:06 celia01 阅读(498) 评论(0) 推荐(0)
摘要:觉得好就顺便转了转自:http://hi.baidu.com/czyuan_acm/blog/item/d0bf7a439d90d21b72f05d69.html 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。1. 输入:格式为:Scanner cin = new Scanner (new BufferedInputStream(System.in));例程:import java.io.*;import java.math.*;import java.util.*;import java.text... 阅读全文
posted @ 2012-08-05 21:10 celia01 阅读(246) 评论(0) 推荐(0)
摘要:转自:http://hi.baidu.com/czyuan_acm/blog/item/8a6f7d88187acd9fa4c2721f.html难得的写的很全面的素数的判断,赞czyuan大神~高消的模板也是广为流传啊素数:只有两个正因数(1和自己)的自然数。素数,作为数论中最基础的理论之一,又是许多著名定理的根源。几个可以无视的性质:1. 1不是素数2. 除了2以为所有偶数都是合数。提高素数,第一反应都会是如果判断素数,找到我们想要的素数。这里列举几种最常用的判断素数的方法。1. 朴素判别素数 简述:即判断一个数N是不是素数,只需要判断从2到N^0.5的数是否能整除N,如果能则不是素数,. 阅读全文
posted @ 2012-08-05 20:23 celia01 阅读(461) 评论(0) 推荐(0)
摘要:题意很简单,给出一个无向图,求其中生成树的个数。这里用到了一个叫(Kirchhoff's matrix tree theorem)的生成树计数原理,具体不知道是什么,柯队介绍上说的。具体可以参见http://wtommy.ycool.com/post.2218850.html按照定理,可以得到一个行列式,求值即可。知道以下几个知识就可以了:1、行列式的值与矩阵的变换关系有密切联系,即可以通过高斯消元的方法求出;2、求值过程中用到了行列式的三个性质: 对换行列式的任意两行(列),行列式的值变号; 行列式的某一行(列)中所有元素都乘以同一个数k,等于用数k乘以此行列式的值; 把行列式的某一 阅读全文
posted @ 2012-08-04 00:54 celia01 阅读(423) 评论(0) 推荐(0)
摘要:题目:http://acm.fzu.edu.cn/problem.php?pid=1759也算是快速幂的一题了,只不过这里的指数B特别大。需要用到一个公式:A^x = A^(x % Phi(C) + Phi(C)) (mod C),其中x≥Phi(C)具体证明可见ac大神博客:http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9。数论学得各种败笔和急于求成,自己的理解就不谈了~直接上代码就是直接用到公式即可: 1 #include 2 #include 3 #include 4 #include 5 #include 6 usi 阅读全文
posted @ 2012-08-03 15:57 celia01 阅读(2915) 评论(0) 推荐(0)
摘要:转:http://blog.sina.com.cn/s/blog_6635898a0100magq.html【转来看看,有时间可以调剂调剂做做数学题】1.burnside定理,polya计数法 这个大家可以看brudildi的《组合数学》,那本书的这一章写的很详细也很容易理解。最好能完全看懂了,理解了再去做题,不要只记个公式。 *简单题:(直接用套公式就可以了) pku2409 Let it Beadhttp://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Colorhttp://acm.pku.edu.cn/JudgeOnline/p 阅读全文
posted @ 2012-08-03 12:54 celia01 阅读(262) 评论(0) 推荐(0)
摘要:以前学树型dp就是随便的看了几道题,没有特别注意树型dp中的小分类的总结,直到上次浙大月赛一道很简单的树型dp都不会,才意识到自己太水了~~come on!hdu1561:题目给出了很多棵有根树,如果把每棵树的根节点都与0相连,则就是一棵完整的有根树了(N 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define see(x) cout son[maxn];12 int n, m;13 void dfs(int x){14 int i, j, k;15 if(son[x].size()==0){16 ... 阅读全文
posted @ 2012-08-02 19:33 celia01 阅读(704) 评论(0) 推荐(0)
摘要:dp一直弱死了,树型dp很多基本的题都不会,最近在刷树型dp的题,把关于树的最长路的思想总结一下:树的直径:树中距离最远的两点间的距离。下面说几道题:hdu 2196:对于树上(双向边)的每一个节点求出与其距离最远的点的距离。这个主要用的思想是两次dfs:一次dfs将无向图转化为有跟树(所以一开是一定要是建双向边,不然很可能wa或者tle,记录过程中可以开数组记入父亲节点,也可以在dfs递推过程中以栈的形式记录)求出每个跟节点到其所有的叶子节点的最远距离f[i]和g[i]。再一次dfs求出能够由父亲节点转化得到的最大距离h[i],求h[i]的过程中就有可能用到f[i]和g[i]了,因为如果i节 阅读全文
posted @ 2012-07-30 20:34 celia01 阅读(6894) 评论(6) 推荐(2)
摘要:一道状态压缩DP,比赛时没时间仔细想了,赛后想了想转移那部分也有点糊里糊涂的,后来请教了一下yk同学,才肯定了一下那个状态表示,后来自己一边探索,一边敲码,一边调试,确认无误后得到1A。看到题很自然的想到从低位开始往高位处理,基本处理加的思路是:在本位上只有可能+1(由1变成0,由0变成1)或者+2(由0变成0,由1变成1,但是存在进位),基本的情况是本位只可能主动+1,如果+2则可能是后一位进位过来了的。基本状态是dp[i][j]:处理玩了第i位(第0~i位异或已经全为0),第i位有j堆需要想第i+1位进位。状态转移:由第i+1位本身的值,加上第i位至第i+1位的进位,会得到一串新的值,但是 阅读全文
posted @ 2012-07-30 20:05 celia01 阅读(426) 评论(0) 推荐(0)
摘要:最大连续子段和有各种方法,很多的都含着暴力的解法,一维O(n)的解法的也已经很熟悉了~现在复习一下,便于进行拓展最大连续子段和a[]数组存储原序列,dp[i]表示处理完第i个数后(包括第i个数在内)的目前最大连续字串dp[i] = dp[i-1]+a[i],如果dp[i] 2 #include 3 4 int main (){ 5 int a[110][110]; 6 int b[110][110]={0};//第k列前j行 7 int n; 8 int i, j, k; 9 int s , max1, max=0;10 scanf("%d",... 阅读全文
posted @ 2012-07-27 14:33 celia01 阅读(784) 评论(0) 推荐(0)
摘要:最长上升子序列(LIS)最长上升子序列是最基本的dp问题,以前一直都只写过O(n^2)的解法,现在终于有时间整理一下了。把poj上的几道最长上升子序列的水题又重新做了一下,主要有1631、2533、3903方法一:O(n^2)dp[i]:表示处理到第i个位置,序列的最长上升子序列末尾为i的长度; a... 阅读全文
posted @ 2012-07-27 00:58 celia01 阅读(2605) 评论(6) 推荐(0)
摘要:题意:一个1~n的序列,分别用'I','D'表示序列的升降,如{1,2,4,3},则是属于IID的情况,而1~4中属于IID情况的可以有很多不同的序列,给出序列的I、D表现形式(‘?’表示‘I’或‘D’都可以),求出满足这样要求的有多少种。例如:Sample InputIIIDDIDD?D?? Sample Output122136HintPermutation {1,2,3} has signature "II".Permutations {1,3,2} and {2,3,1} have signature "ID".P 阅读全文
posted @ 2012-07-27 00:20 celia01 阅读(558) 评论(0) 推荐(0)
摘要:3244 一个数学题Difference between TripletsFor every pair of triplets, Ta = (Ia, Ja, Ka) and Tb= (Ib, Jb, Kb), we define the difference value between Ta and Tbas follows:D(Ta, Tb) = max {Ia − Ib, Ja − Jb, Ka − Kb} − min {Ia − Ib, Ja − Jb, Ka − Kb}Now you are given N triplets, could you write a program to 阅读全文
posted @ 2012-06-12 22:16 celia01 阅读(208) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=1147题目描述:就是求解bwt压缩算法的逆过程。一个长度为N的01序列,会有N个不同的轮换(当然,字符相同,其中也可能会有相同的),将这N个不同轮换按字典序排序,取排序后的每个轮换的最后一排,组成一个序列。题中给出压缩后的序列,求原始序列,输出的是字典序最小的那个序列解法:整个解法还挺巧妙的,具体百度上也有解释,简单的根据体重给出的例子说一下:0001100110011001000111000给出的序列中0和1的个数肯定是和原始序列一样的,即由最后一列的数据10010可知原始序列中有2个0和3个1,所以将最后一列(10010)进行 阅读全文
posted @ 2012-06-12 22:06 celia01 阅读(1554) 评论(0) 推荐(0)
摘要:刷了好几道高斯消元的题,感觉掌握的应该差不多了,这道还算比较经典。(感觉高斯消元就是模板题)题目描述:多组数据,N个开关,给出N个开关操作前和操作后的状态,再给出有联系的开关,每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。解法:高斯消元,建立一个N*N的方程组,由开关间的状态可以确定方程组的系数,方程组的bn为初状态和末状态异或得出。View Code 1 Source Code 2 3 Problem: 1830 User: celia01 4 Memory: 704K Time: 0MS 5 Language: G++ Result: Accepte... 阅读全文
posted @ 2012-04-06 23:54 celia01 阅读(1769) 评论(0) 推荐(0)
摘要:题目描述:求八数码的解,输出x的移动方式(输出步数最少的解,但是也可能会有多解,所以是special judge)如果判断8数码有没有解可以用逆序数求,找出规律即可求解解法一:搜索(没写过)解法二:康托展开,一种hash的方法。int try_to_insert(int s){ int code = 0; for(int i=0;i 9 #include 10 #include 11 #include 12 #include 13 #include 14 #define see(x) cout=0&&newx=0&&newy0) Path(ans);102 el 阅读全文
posted @ 2012-04-06 23:28 celia01 阅读(356) 评论(0) 推荐(0)