随笔分类 -  01. . . . . |HDU

HDU 2767:Proving Equivalences(强连通)
摘要:题意:一个有向图,问最少加几条边,能让它强连通方法:1:tarjan 缩点2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以是强连通了。如果说有几个结点不连通,那么让他们的尾结点相互只向对方的头结点就好了。那么,最后的答案就是,头结点和尾结点中比较小的那个数量。当然,如果缩点后只有一个点,那么就是0;代码:#include #include #include #include using namespace std;#define N 20010using namespace std;vector to[N];vector . 阅读全文

posted @ 2014-04-09 22:03 ShineCheng 阅读(148) 评论(0) 推荐(0)

POJ 2828: Buy Tickets(线段树)
摘要:扯淡:这题要赞。因为卡了我两次……第三次终于做出来了。。。好吧是看了别人代码之后T T。太弱太弱。。。题意:有n个人排队,但他们会插队。他们按先后顺序来到,每次每个人选择插在Pos[i]这个位置,问最后的排队情况(每个人用其val值表示)。(1 ≤ N ≤ 200,000) 思路:容易想到,最后一个人,插哪,那它就在哪。也就是说,一个人的最后位置,只会被它后面的人影响到。再分析,就会发现,如果一个人插在Pos[i]这个位置,那么表示,它插入的时候,前面有Pos[i]个人(废话)。那么我们倒着计算的时候,由于他后面的人已经进来了,那么第i个人站的实际位置,是在它前面还有pos[i]个空位的位置( 阅读全文

posted @ 2014-04-09 14:38 ShineCheng 阅读(153) 评论(0) 推荐(0)

HDU 1754:I Hate It(线段树-单点更新)
摘要:题意:1~N这些人有一些分数,之后有M条操作。要求支持两种操作:更新其中某个人的成绩,查询[A,B]区间内的人的最高成绩。 ( 0#include #include using namespace std;#define N 200020#define lson l, mid, rt mid) ans = max(ans, query(L,R,rson)); return ans;}void update(int pos, int v, int l, int r, int rt) { if (l == r) { tree[rt] = v; return;... 阅读全文

posted @ 2014-03-15 12:55 ShineCheng 阅读(150) 评论(0) 推荐(0)

HDU 4734: F(x) (数位DP)
摘要:总结:去数字那维的方法,就是改成循环里面枚举当前位(之前的做法是枚举下一位)抽象出口,可以从前一个有意义的状态来推导出其意义。类型:数位DP题意:F(x) = A n * 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1.问[0,B]之间满足F(x) num[i])定义:dp[i][f] 表示所有i位数中(含前导0),F() #include int dp[12][10000];int num[30];int getf(int x) { int ans = 0; int len = 0; while (x) { a... 阅读全文

posted @ 2014-03-14 12:07 ShineCheng 阅读(207) 评论(0) 推荐(0)

HDU 2089:不要62(数位DP)
摘要:类型:数位DP题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0#include int dp[15][10];int num[120];int dfs(int i, int now, bool iscount) { if (!iscount && dp[i][now] != -1) return dp[i][now]; if (i == 1) { if (now == 4) return dp[i][now] = 0; else return dp[i][now] = 1; } int end ... 阅读全文

posted @ 2014-03-13 20:20 ShineCheng 阅读(159) 评论(0) 推荐(0)

HDU 4722:Good Numbers(数位DP)
摘要:类型:数位DP题意:定义一个Good Number 为 一个数所有位数相加的和%10==0.问[A,B]之间有多少Good Number.方法:正常“暴力”的定义状态:(i,d,相关量)定义dp[i][d][mod] 为 d开头的i位数中,%10==mod的数的个数dp[i][d][mod] = sum(dp[i-1][0~9][(mod-d+10)%10]出口:dp[1][d][mod] = (d==mod);代码:#include #include #include #include using namespace std;long long dp[20][10][10];int num[ 阅读全文

posted @ 2014-03-13 20:13 ShineCheng 阅读(198) 评论(0) 推荐(0)

HDU 3709: Balanced Number (数位DP)
摘要:类型:数位DP题意:定义平衡数为:以某位数为中心,左边的每位数*这个数离中心的距离 == 右边的每位数*这个数离中心的距离。问[x,y]之间有多少平衡数思路:做的莫名奇妙……定义:dp[i][d][k][b] 为 首位为d的i位数,以第k位为中心点,平衡因子为b的数的个数。平衡因子定义为,中心点右边的和-中心点左边的和。实际上这个状态定义冗余了。不需要定义首位d,同时,平衡因子如果定义成,之前所有数的加权和为b,那就不有写这么复杂了。唉,现在有点乱。理不清楚啊。#include #include #include #define BB 1000using namespace std;long 阅读全文

posted @ 2014-03-12 22:49 ShineCheng 阅读(165) 评论(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)

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)

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)

HDU 4749: Parade Show
摘要:看大神代码,发现上交大神很棒的一个思路题意:在源数字串中找出尽量多的连续子串,要求子串任意两值的大小关系与目标串相同位置的值的大小关系相同。求源串能拿出的子串的最大数量。关键词:RK-Hash优点:O(k)时间完成匹配检查(关键在于他能O(1) 完成 所有 相同位 检查)方法:对于一个K值,用某个进制数来表示其位置。 比如 123121 中 的值 1 最后表示成 100101。 然后,对于目标串也RK-hash,对于某个值,只要比较这个数,就能知道是否相同位都相同了。代码留恋:#include#include#include#include#includeusing namespace std 阅读全文

posted @ 2013-09-21 23:10 ShineCheng 阅读(424) 评论(0) 推荐(0)

hdu 2058:The sum problem
摘要:题意序列1,2,...n,求出所有子串,使得和为m类型数学思路由求和公式易得b(b+1)/2 - a(a+1)/2 = m ( 0 File Name: hd2058.cpp > Author: Shine > Created Time: 2013-06-27 下午 6:16:55 > QuestionType: 数学 > Way: (b-a)(a+b+1) == 2m (其实暴力枚举a+b+1的值就可以了(到根号2m)) > Submit: 3WA 1AC > Gain: 尝试了一下状态枚举和分解质因子的写法 > Experien... 阅读全文

posted @ 2013-06-27 20:19 ShineCheng 阅读(274) 评论(0) 推荐(0)

HDU 2059:龟兔赛跑
摘要:题意一条直线上有n个充电站(告诉你位置),乌龟刚开始有满电的电车,能开c距离,电动速度vt1,没电后脚踩速度vt2,到充电站可以选择充电,充电时间为t。直线长l, 兔子速度为vr, 问乌龟有没有可能赢。类型:DP思路:my:类似cf一题的思路大体思路:把一段路合理分割,就可以把重叠的区间分开,然后就可以算出每段路的最小花费。最后寻找最短的拼接方法就好了。首先状态压缩,节点为所有充电站的点和他们+c的点(另外:包含0和c)然后对于每个点i,算出他们到之前的某个点j的最小花费cost[i][j]然后 设dp[i]为到i号节点所需最小时间状态转移为 dp[i] = min(dp[j] + cost[ 阅读全文

posted @ 2013-06-26 13:08 ShineCheng 阅读(260) 评论(0) 推荐(0)

HDU 1203:I NEED A OFFER!
摘要:首先想明白怎么计算概率,就是计算他的逆事件,也就是算失败概率然后用1减然后很自然的得到递推式dp[v] = min(dp[v], dp[v-c[i]]*(1-w[i])dp[v]状态的值表示当前状态下的失败概率注意dp数组初始化为1附代码HDU 1203:I NEED A OFFER!/************************************************************************* > File Name: hdu1203.cpp > Author: Shine > Created Time: 2013-05... 阅读全文

posted @ 2013-05-10 14:48 ShineCheng 阅读(171) 评论(0) 推荐(0)

HDU 2546 饭卡
摘要:类型:01背包策略就是把最大的留起来,剩下的尽量去买到5块钱,最后用最大的买。留最大不用说。尽量买到5块钱就是一个背包问题。即 背包容量为m-5每个物品的容量=价值=菜的价格特殊判断:如果m < 5直接输出就可以证明策略正确性:假设最后买的不是最大的,设为b.最大的设为a. 其他设为C有(C+a)这个组合尽量买到5块钱 + b > (C+b)->5块钱 + a1: C+a <= m-5则 C+b <=m-5此时 C+a+b = C+b+a 假设不成立2: C+a > m-5则假设Ci + a 是其尽量买到5块钱的最优组合因为 Ci+b < m-5 (C 阅读全文

posted @ 2013-05-10 10:10 ShineCheng 阅读(175) 评论(0) 推荐(0)

导航