HDU
文章平均质量分 50
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
HDU 2151 Worm
题目是中文,题意就不啰嗦了.设dp[i][j] 为第i分钟后到达第j颗树的方案数.dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1] 满足j - 1>= 0 && j + 1 初始化为dp为-1base case: dp[0][P] = 1#include #include using namespace std;const in原创 2014-03-19 09:04:48 · 466 阅读 · 0 评论 -
HDU 4190 Distributing Ballot Boxes(二分答案)
对最大人口进行二分.#include #include #include #include using namespace std;const int maxn = 500001;int pops[maxn] ,N, B;int main(){ while(scanf("%d%d", &N, &B)){ if(N == -1 && B == -1)break; int原创 2013-05-04 09:45:08 · 596 阅读 · 0 评论 -
HDU 4510 小Q系列故事——为什么时光不能倒流
水题.#include #include #include using namespace std;int H, M, S;int main(){ int t; scanf("%d", &t); while (t--){ int h, m, s; scanf("%d:%d:%d %d:%d:%d", &H, &M, &S, &h, &m, &s); if(S<s){原创 2013-05-04 12:18:13 · 501 阅读 · 0 评论 -
HDU 4506 小明系列故事——师兄帮帮忙(快速幂)
列几个例子就可以看出来规律了.#include #include #include using namespace std;#define MOD 1000000007const int maxn = 10001;long long seq[maxn];long long n, t, k;long long quick_pow(long long a, long long b)原创 2013-05-04 08:23:47 · 452 阅读 · 0 评论 -
ZOJ 4508 湫湫系列故事——减肥记I(完全背包)
刚开始以为是每种食物只能吃一个,发现第二个例子怎么也凑不起来,后来才发现是完全背包.#include #include #include using namespace std;const int maxn = 100001;int dp[maxn], v[101], w[101], n, m;int main(){ while (~scanf("%d", &n)){ for原创 2013-05-04 11:06:05 · 498 阅读 · 0 评论 -
HDU 2192 MagicBuilding(贪心)
首先对size排序,然后随便弄弄就可以了#include #include #include #include using namespace std;const int maxn=10010;int s[maxn],n;bool vis[maxn];int main(){ int t; scanf("%d",&t); while (t--){ scanf("%原创 2013-04-21 15:13:13 · 409 阅读 · 0 评论 -
HDU 2546 饭卡(01背包)
我的做法是找出n种菜中最贵的价格k,把背包的容量m增加的到m+k然后对价格排个序,因为DP是从第一个菜到最后一个菜,越贵的菜越后选结果越小,然后进行DP#include #include #include #include using namespace std;const int maxn=1010;int w[maxn],dp[maxn][maxn],n,m;int原创 2013-04-20 23:15:48 · 425 阅读 · 0 评论 -
HDU 1176 免费馅饼(简单数塔DP)
把时间看成层数,就成了简单的数塔了#include #include #include using namespace std;const int maxn=100010;int dp[maxn][11],n;int main(){ while (scanf("%d",&n)&&n){ memset(dp,0,sizeof(dp)); int maxn=0; for原创 2013-04-22 07:49:07 · 432 阅读 · 0 评论 -
HDU 2084 数塔(简单DP)
从倒数第二层向上推方程:t[i][j]=max(t[i+1][j],t[i+1][j+1])+t[i][j]t[0][0]就是答案了#include #include #include using namespace std;const int maxn=101;int tower[maxn][maxn],n;int main(){ int t; scanf("%d"原创 2013-04-21 17:44:25 · 446 阅读 · 0 评论 -
HDU 1520 Anniversary party(树形DP入门)
d[i][0]表示i结点参加party而i结点儿子结点不参加 转移:d[i][0]=rating[i]+sum(dp[j][1]) i结点的rating加上所有的儿子结点不参加的值d[i][1]表示i结点不参加而让儿子结点门选择参加或者不参加 转移d[i][1]=sum(max(dp[j][0],dp[j][1])) i结点不参加的值为所有儿子结点的参加或者不参加的最大值的和#includ原创 2013-04-27 22:45:20 · 510 阅读 · 0 评论 -
HDU 1561 The more, The Better(树形DP)
dp[i][j]表示为在i结点上选择j个节点的最大值转移方程:dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]);//在i的结点上选择j+k的的值为 max(在i结点上选择j+k个结点的值,在i结点上选j个结点+在i的儿子结点v上选择k个结点的值)#include #include #include using namespace std;原创 2013-04-28 13:52:16 · 399 阅读 · 0 评论 -
HDU 1702 ACboy needs your help again!
水题,栈和队列操作#include #include #include #include #include using namespace std;char buf[20];queueque;stackstk;int main(){ int t ; scanf("%d",&t); while (t--){ int opn; scanf("%d%s",&opn原创 2013-04-25 18:40:06 · 400 阅读 · 0 评论 -
HDU 4509 湫湫系列故事——减肥记II(线段树)
刚开始的想法是线段树区间求和,延迟更新.要注意区间是半开的[x,y)后来发现直接用数组都可以过....#include #include using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1 const int maxn = 1441;int segs[maxn原创 2013-05-04 11:52:29 · 552 阅读 · 0 评论 -
HDU 4524 郑厂长系列故事——逃离迷宫
直接暴力了.每次对boxes[i] 和 boxes[i + 1] 减去两者较小值, 如果减完后boxes[i] 不是0 则不能逃出迷宫.#include #include #include using namespace std;const int maxn = 1000001;int boxes[maxn], n;int main(){ int T; scanf("%原创 2013-05-10 18:57:20 · 524 阅读 · 0 评论 -
HDU 2571 命运
题意:给出一个矩阵,要求从1,1走到n,m,每个格子里都有一定的幸运值,每次只能向下或向右走,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。求走到n,m能得到的最大幸运值.算一道简单的dp题吧.设dp[i][j]为走到i,j位置能得到的最大值.那么dp[i][j]=max(dp[i][j - 1], dp[i - 1][j],原创 2014-03-17 08:59:29 · 541 阅读 · 0 评论 -
HDU 4135 Co-prime
和1695题类似的题目,不过简单点.求区间[A,B]里和N互质的数的个数,那么可以通过容斥原理求出[1, r] 区间里和N互质的数的个数.容斥原理的方法和1695题的方法类似,这里给上链接1695.答案自然就是[1, B] - [1, A].#include #include #include using namespace std;const int MAX = 1000001;原创 2014-03-09 14:41:16 · 487 阅读 · 0 评论 -
HDU1787 GCD Again(容斥原理)
和1695类似的题目,只不过这次求的是不互质数的个数.#include #include #include #include using namespace std;const int MAX = 1000005;bool is_prime[MAX];int prime[MAX / 10], prime_idx;void init_prime(){ memset(is_pr原创 2014-03-09 21:52:13 · 420 阅读 · 0 评论 -
HDU 1788 Chinese remainder theorem again
题目介绍了一大堆中国剩余定理的东西,其实没有用到.求N,满足N%Mi = Mi - a.也就是(N + a) % Mi = 0,那么只要求出Mi的最小公倍数再减一个a那么就是答案了.注意用long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a原创 2014-03-10 09:39:05 · 571 阅读 · 0 评论 -
HDU1614 | UVA 103 Stacking Boxes
数塔类型的dp,记忆化搜索就可以了.注意杭电的输出最后有一个空格.#include #include #include #include using namespace std;const int MAX = 31;struct Box{ int id, dims[11];}boxes[MAX];bool g[MAX][MAX];int dp[MAX], fa[MAX]原创 2014-03-10 09:01:29 · 729 阅读 · 0 评论 -
HDU 1695 GCD(欧拉函数+容斥原理)
求[1..b]中的x和[1..d]中的y有多少gcd(x,y) = k.要求gcd(x,y) = k,则等价于求 gcd(x/k,y/k) = 1.所以问题转化成求[1..b/k]和[1..d/k]中有多少对gcd(x,y) = 1.进一步转换成 枚举[1,d]区间里的n与][1, b]的区间的数互质的个数,这里d>=b.因为[1,b]包含在[1,d]里,所以[1,b]相当于累加欧原创 2014-03-09 13:40:30 · 733 阅读 · 0 评论 -
HDU1920 Jackpot
题意:求n个数字同时到0的周期.就是求最小公倍数.注意long long.#include using namespace std;long long gcd(long long a, long long b){ return !b ? a : gcd(b, a % b);}int main(int argc, char const *argv[]){ int T;原创 2014-03-10 21:40:00 · 523 阅读 · 0 评论 -
HDU1905 Pseudoprime numbers
题意:给出p, a两个整数,判断p是否是以a为底的假素数,也就是要满足a^p=a(mod p).可以用快速幂取模求出a^p来做.#include using namespace std;bool is_prime(int n){ for(int i = 2; i * i <= n; ++i){ if(n % i == 0)return false; } return tru原创 2014-03-10 19:57:12 · 631 阅读 · 0 评论 -
HDU3988 Harry Potter and the Hide Story
首先对K进行素因子分解,分解成:p1^r1 * p2^r2*...pk^rk.然后求出n!含有的K的因子pi的个数,把这个数除以ri得到一个值,取这个值最小值就是答案.#include #include #include using namespace std;#define INF 9223372036854775807LLconst int MAX = 10000050;原创 2014-03-04 20:57:10 · 595 阅读 · 0 评论 -
HDU1492 The number of divisors(约数) about Humble Numbers
首先把n分解成2, 3, 5, 7相乘的形式.然后通过二进制枚举各个因子相乘的组合.#include #include using namespace std;const int p[4] = {2, 3, 5, 7}; int expo[4], exp_idx;int main(){ long long n; while(~scanf("%I64d", &n) && n){原创 2014-03-04 20:45:45 · 561 阅读 · 0 评论 -
HDU 4151The Special Number(暴力+二分)
首先枚举1 - 1000W的数字,把是special的数存在数组中,然后二分查找第一个大于n的数的位置.#include #include #include using namespace std;const int maxn = 1000000;int tb[maxn], n, idx;void init(){ for(int i = 1; i <= 10000000; +原创 2013-05-10 20:05:57 · 780 阅读 · 0 评论 -
HDU 2602 Bone Collector(裸01背包)
#include #include #include using namespace std;const int maxn=1010;int dp[maxn],v[maxn],w[maxn],n,m;int main(){ int t; scanf("%d",&t); while (t--){ memset(v,0,sizeof(v)); memset(w,0,size原创 2013-04-14 13:32:08 · 445 阅读 · 0 评论 -
ZOJ 1087 Super Jumping! Jumping! Jumping!(简单DP)
方程:f[i]=max(f[j])+a[i](a[i]>a[j]&&0答案是最大的f[i]#include #include #include using namespace std;const int maxn=1010;int dp[maxn],a[maxn],n;int main(){ while (scanf("%d",&n)&&n){ for (int i原创 2013-04-21 23:02:54 · 581 阅读 · 0 评论 -
HDU 1394(线段树)
转自:http://wenku.baidu.com/view/6e02b7492e3f5727a5e9623f.html如何求最小逆序数呢?(我这里假设一个序列中每个数字都不同) 若abcde...的逆序数为k,那么bcde...a的逆序数是多少?我们假设abcde...中小于a的个数为t-1 , 那么大于a的个数就是n - t,当把a移动左移一位时,原来比a大的现在都成了a的逆序对,即逆原创 2013-04-01 09:40:27 · 454 阅读 · 0 评论 -
HDU 1595 find the longest of the shortest
做法就是先求出最短路径,然后枚举每一条最短路的边,每次枚举一条删除掉求最短路,求出最大的长度就是答案了#include #include #include #include #include #include using namespace std;#define pii pairconst int maxn=1010;int g[maxn][maxn],dis[maxn]原创 2013-04-08 08:25:26 · 462 阅读 · 0 评论 -
HDU 2923 Einbahnstrasse(邻接表+dijkstra)
这题和ZOJ 2008做法一样,求两次最短路,一次是s到各个点,一次是把图反向后s到各个点.两个结果相加就是答案.用spfa或者dijkstra都可以.#include #include #include #include #include using namespace std;const int maxn=110;struct edge{ int v,w,n原创 2013-04-07 15:56:43 · 474 阅读 · 0 评论 -
HDU 2680 Choose the best route(dijkstra)
又是一道最短路,如果普通的按照从w个点到s的最短距离中选择最短的会超时,因为w可能很接近n.可以把所有的边反一下就变成了求从s点到w个点最短距离中的最短距离,复杂度一下子就下来了.参考了网上还有一种方法:设一个超级原点,把这个超级原点和w个起点连边,权值为0,然后求超级原点到s的最短路就是答案的,很巧妙的方法#include #include #include #include原创 2013-04-07 12:54:35 · 487 阅读 · 0 评论 -
HDU 2111 Saving HDU
贪心,按价值从大到小排序#include #include #include using namespace std;const int maxn=110;struct stuff{ int v,w; bool operator<(const stuff &rhs)const{ return v>rhs.v; }}stuf[maxn];int v,n;int m原创 2013-04-04 13:49:26 · 475 阅读 · 0 评论 -
HDU 2037 今年暑假不AC
开始按照节目的时间长度从小到大排序,然后枚举就可以了#include #include #include #include using namespace std;const int maxn=110;struct Show{ int s,e; bool operator<(const Show rhs)const{ return (e-s)<(rhs.e-rhs.s);原创 2013-04-04 13:14:57 · 448 阅读 · 0 评论 -
HDU 2570 迷瘴
浓度按照从小到大排序,一直累加到超过W就可以停了,该死的比例转来转去头都晕了.#include #include #include #include using namespace std;const int maxn=110;int P[maxn],n,V,W;int main(){ int t; scanf("%d",&t); while (t--) {原创 2013-04-04 16:26:50 · 532 阅读 · 0 评论 -
HDU 2124 Repair the Wall
#include #include #include #include using namespace std;const int maxn=610;int len[maxn],n,L;int main(){ while (scanf("%d%d",&L,&n)==2) { long long tl=0; for (int i=0;i<n;++i){ scanf(原创 2013-04-04 14:00:06 · 466 阅读 · 0 评论 -
HDU 1800 Flying to the Mars
贪心,从大到小排列,计算数量最少的下降序列,和zoj1025很类似#include #include #include #include using namespace std;const int maxn=3010;int lev[maxn];int n;int main(){ while (scanf("%d",&n)==1) { for (int i=0;i<n;+原创 2013-04-04 11:27:44 · 425 阅读 · 0 评论 -
HDU 1698 Just a Hook
和poj3498差不多,lazy思想#include #include #include using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=100000;int sum[maxn<<2],f[maxn<<2],N,Q;void pushUp(int rt){原创 2013-04-02 12:58:26 · 473 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树)
#include #include #include using namespace std;const int maxn=200000;int sc[maxn<<2],n,m;#define lson l,m,rt<<1//左子树 #define rson m+1,r,(rt<<1)|1//右子树void pushUp(int rt){ sc[rt]=max(sc[rt<<原创 2013-04-01 08:29:13 · 408 阅读 · 0 评论 -
HDU 1166 敌兵布阵(线段树)
第一道线段树的题目,正在学习中#include #include #include using namespace std;#define MAX 55555int sum[MAX<<2],n;void pushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ if(l原创 2013-04-01 08:05:03 · 571 阅读 · 0 评论 -
HDU 1599 find the mincost route
把每一条边删除掉然后求一次这条边顶点之间的最短距离,最短距离加上删除掉的边的权值就是环的权值,然后求出最小环值.如果删除了这条边,两点不连通了 说明两点无法构成一个环.m次dijkstra#include #include #include #include #include #include #define inf 0X20202020#define pii pair原创 2013-04-08 09:33:17 · 643 阅读 · 0 评论