HDU
文章平均质量分 60
丶阿明
Hello World!
展开
-
HDU 4349 Xiao Ming's Hope
题意:给你一个数 n ,求C(n, 0) 到 C(n, n)中有多少个奇数分析:判断C(n, i)是不是奇数,相当于求 C(n, i) %2,根据Lucas定理,求C(n ,i) % 2 先将 n 和 i 转化为2进制,分别为(a[k], a[k-1],...,a[1], a[0])2 和 (b[k], b[k-1],...,b[1], b[0])2,所以C(n, i)%2 = C(a[k],原创 2017-03-19 18:38:05 · 533 阅读 · 0 评论 -
HDU 2602 Bone Collector
分析:简单的01背包问题,状态转移方程为:dp[i][v]=max{dp[i-1][v],dp[i-1][v-w[i]]+val[i]},其中dp[i][v]表示前i件物品放在容量为v中的最大值。转化为一维数组的状态转移方程为:dp[v]=max{dp[v],dp[v-w[i]]+val[i]},其中循环为v=V...w[i],保证推f[v]时f[v-w[i]]保存的是状态f[i-1][v-w[i原创 2015-05-27 20:10:35 · 479 阅读 · 0 评论 -
HDU 5253 连接的管道
分析:题意就不说了,因为这题的高度差比较小,所以可以用并查集暴力求解,做的时候发现带参数的宏定义的效率很低,比如我用# define abs(x) (x>0?x:-(x)) 这样就超时了,写个函数就不会超时,用暴力的话,一不小心就超时了。这题还可以用Kruskal的最小生成树来做,但速度居然没有暴力的快,也许是我写的姿势不对。并查集暴力:# include # include in原创 2015-08-21 14:40:27 · 447 阅读 · 0 评论 -
HDU 5256 序列变换
分析:因为要改变最少的数,使得数组a,成为严格递增,也就是使得a[i+1]>=a[i]+1,即a[i+1]-(i+1)>=a[i]-i。所以令a[i]=a[i]-1,原题就变成了改变最少的数,使得新数组a[i]-=i,不递减,即a[i+1]>=a[i],那么我们只需找出最多已满足条件的元素(即最长不递减子序列),再用总的个数减一下就能得出答案。如何求最长不递减子序列呢?我们用数组b[i]来表示:不原创 2015-09-25 21:00:15 · 557 阅读 · 0 评论 -
HDU 5285 wyh2000 and pupil
分析:这题和POJ 2492差不多,所以我用的是并查集,可以把题意理解为有很多人,要分成两个帮派,每个帮派至少有1个人,输入n,m分别代表n个人,和m对有冲突的人,有冲突的不能在一个帮派里,要尽可能的使第一个帮派的人多一些,如果存在输出第1,2个帮派的人数,否则输出Poor wyh 。如果输入n=0或n=1的话肯定不满足题意,用root[]数组记录每个人的老大是谁,opp[]记录每个人的对手是原创 2015-08-20 10:21:14 · 507 阅读 · 0 评论 -
HDU 5363 Key Set
分析:给你一个元素为1~n的集合,让你求有多少个非空子集,子集内的元素之和为偶数。容易推出:ans=2^(n-1)-1,因为n过大,所有用快速幂来求。# include __int64 FastExp(__int64 a,__int64 b) { __int64 ans=1; while(b) { if(b&1)原创 2015-08-06 19:05:15 · 351 阅读 · 0 评论 -
HDU 5400 Arithmetic Sequence
分析:给你n个数和d1,d2,问有多少个区间满足“可以将该区间分为两个子区间,前一个区间是公差为d1的等差数列,后一个区间是公差为d2的等差区间,其中可以有一个子区间为空。如果给定的前len个数从第1个数到第len个数的这个区间满足题意,且第len+1个数也满足,就能新加len+1个满足题意的区间。比如:d1=2,d2=-2,前5个数是1 3 5 7 5,如果第6个数为3,那么他前5个数满足题意,原创 2015-08-19 14:22:00 · 472 阅读 · 0 评论 -
HDU 5280 Senior's Array
分析:给你n个数字,和一个p,让你改变n个数中的一个数为p,使得最长连续子序列之和最大。因为n不大,# include __int64 MAX(int n,int a[1005]) { __int64 i,sum=0,ans=-1e9; for(i=0;i<n;i++) { sum+=a[i]; if(sum>a原创 2015-08-18 10:27:39 · 626 阅读 · 0 评论 -
HDU 2084 数塔
分析:大水题,看代码。# include # include # define Max(x,y) (x>y?x:y) int main() { int i,j,n,t,max,a[105][105],dp[105][105]; scanf("%d",&t); while(t--) { scanf("%d",&n);原创 2015-08-18 10:31:35 · 630 阅读 · 0 评论 -
HDU 1864 最大报销额
分析:因为这里“背包容量”和“物体的体积”都是有小数的,所有同一乘以100就是整数了,先把所有的符合条件的发票选出来,然后就是01背包问题了。# include # include int Max(int a,int b) { return a>b?a:b; } int dp[3000005]; int main() { int i,j,n,原创 2015-08-21 17:35:12 · 375 阅读 · 0 评论 -
5504 GT and sequence
分析:题意就是给你n个数,让你至少选一个数,使得你选的这些数的乘积最大。如果只有1个数,就直接输出了,如果有正数或负数的个数大于2,答案肯定大于0,否则答案为0.# include # include using namespace std; int main() { int i,n,T,t,f; __int64 x,ans,a[100];原创 2015-10-18 10:27:44 · 652 阅读 · 0 评论 -
HDU 5505 GT and numbers
分析:给你2个数n,m,n每次都能乘以他的一个因子成为新的n,问你n至少乘多少次能够变成m,如果不能的话就输出-1。如果n能变成m话,m肯定是n的整数倍,初始的n乘以多个因子变成m,那么那些因子的乘积就是m/n,也就是n*(m/n)=m,所以每次都找到d=Gcd(n,m/n),然后n'=n*d,(m/n)'=(m/n)/d,直到n=m。如果d=1的话,n也不能变成m.这题的坑点就是1# inc原创 2015-10-18 10:43:37 · 879 阅读 · 0 评论 -
HDU 1081 To The Max
分析:题意是给你一个整型二维数组,让你求总和最大的子矩形。解法是将 求一维数组的最大的连续子序列 扩展成二维。这是求一维数组的最大的连续子序列的代码:# include int main() { int i,n,sum,max,a[100]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf原创 2015-06-02 20:12:37 · 458 阅读 · 0 评论 -
HDU 5652 India and China Origins
题意:给你n*m的矩阵,0代表平原,1代表高山,接下来q年,每年在(x,y)的位置长出一座高山,问你第几年中国和印度不连通。分析:第一种做法是BFS判断能不能从中国走到印度,如果一年一年找的话就会超时,所以查找第几年的时候,可以用二分查找,这样会快很多。第二种做法是并查集,第0列的所有山都并起来,第m-1列的所有山都并起来,对于每座高山,把它周围8个方向的高山并起来,最后判断第0列和第m-原创 2016-03-31 20:29:25 · 460 阅读 · 0 评论 -
HDU 5476 Explore Track of Point
题意:给你3个点A,B,C的坐标,其中AB=AC,M为BC的中心,三角形内有一点P,让你求P的轨迹的长度,使得min{∠MPB+∠APC,∠MPC+∠APB}最大。当P在以BC为底的△ABC的高上时,必有∠MPB+∠APC=∠MPC+∠APB=180°,所以P的轨迹长度之一为△ABC的高h.现在就是求P的其它的轨迹长度,使∠MPB+∠APC=∠MPC+∠APB=180°。作⊙O,使得B原创 2015-10-15 17:34:59 · 626 阅读 · 0 评论 -
HDU 5248 序列变换
分析:题意可以理解为,给你含有n个正整数的数组a,让你找一个严格单调递增的数组b,使得cost(a,b)=max(|a[i]-b[i]|) (1d.找数组b的时候,b[i]肯定要>=a[i]-d,且b[i]>=b[i-1]+1,所以我们取这两个中较大的,如果b[i]>a[i]+d的话,那么cost就>d了,不满足条件,返回false。# include int n,a[100005],原创 2015-09-24 20:09:48 · 871 阅读 · 0 评论 -
HDU 1016 Prime Ring Problem
分析:给你n个球序号分别为1,2....n,让你排成一个环,使得任意相邻2个球的序号和为素数,输出所有满足条件的序列,1是开头,按字典序输出。这题可以看做是n个顶点,任意两个顶点之间有一条无向边,遍历所有顶点,使得遍历的结果围成一个圈,任意2个相邻的点的和为素数,然后用DFS遍历图。# include # include int n,top,s[35],visit[25],stack[原创 2015-10-24 00:24:11 · 418 阅读 · 0 评论 -
HDU 1010 Tempter of the Bone
分析:迷宫问题,要求从S恰好走t步到达D,如果从S到D的最短距离大于t或者S到D的距离和t一奇一偶都不可能到达,直接输入NO,否则Dfs搜索所有可能的路如果存在满足条件的就标记flag=1。# include # include # define abs(x) (x>0?x:-(x)) int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; in原创 2015-07-24 21:23:41 · 323 阅读 · 0 评论 -
HDU 2446 Shell Pyramid
分析:题意就是给你一个正4面体的金字塔,从顶往底数,第1层有c[1]=1个球,第2层有c[2]=3个球.....第i层有c[i]=c[i-1]+i个球,第i层有i行,第j行有j个球,现按层从顶往底,按行从上往下,按列从左往右,依次对每个球进行编号1,2,3,4....... 问你序号为n的球在第几层,第几行,第几列。用数组c[i]来表示第i层有c[i]个球,s[i]表示第i层最大的球的序号,那么s原创 2015-10-24 00:04:54 · 444 阅读 · 0 评论 -
HDU 1078 FatMouse and Cheese
分析:题意就是,输入n,k然后输入n阶矩阵,从起点(0,0)开始走,可以往上/下/左/右,4个方向直走,一次最多可以走k步,要求走到的下一个点必须比当前的点大,输出走到的所有点的值之和最大为多少。这题用DFS暴力肯定超时,可以用记忆化搜索,用dp[i][j]表示以点(i,j)为起点,走到的所有点的值之和的最大值,要求dp[i][j],只要知道(i,j)一次能走到的所有点的dp[i'][j']中的最原创 2015-10-24 00:38:11 · 440 阅读 · 0 评论 -
HDU 2138 How many prime numbers
分析:题目就是让你求给定的n个数中有多少个是素数,用一般的方法要么超时要么超内存,可以用 miller_rabin 算术来快速的判断一个数是不是素数。# include # include __int64 ModMul(__int64 a,__int64 b,__int64 n) { __int64 ans=0; while(b) {原创 2015-07-25 20:51:21 · 381 阅读 · 0 评论 -
HDU 5305 Friends
分析:给你n个人,和m个朋友关系,让你求满足每个人的线上和线下的朋友数相等的方案有多少种。如果有一个人的朋友数为奇数,不存在可行解,输出0,否则令每个人未确认的线上朋友on[i]和线下朋友off[i]的个数相等都为du[i]/2,然后从第一条边开始Dfs搜索,如果第num条的连的两个点都有未确认的线上朋友,则确认顶点u,v为线上朋友,所以未确认的on[u]--,on[v]--然后继续搜索下一条边,原创 2015-07-24 21:14:09 · 361 阅读 · 0 评论 -
HDU 5317 RGCDQ
分析:F(x)就是x有几个不同的质因数,比如210=2*3*5*7,所以F(210)=4,让你求区间[l,r]内最大的GCD(F(i),F(j)),(l1000000,所以F(x)# include # include int count,prime[1000]; int f[1000010],a[1000010]; int F(int n) { int i,a原创 2015-07-28 19:50:20 · 415 阅读 · 0 评论 -
HDU 5326 Work
分析:一个公司有n个人,给你n-1对关系a b,代表a管理b,问你有多少人管理k个人。遍历每个人管理的人的数量count,如果count==k,ans++;遍历的思想就是BFS。# include # include # include typedef struct node { int num; struct node *next; }Node;原创 2015-07-28 20:05:06 · 623 阅读 · 0 评论 -
HDU 2082 找单词
分析:举个例子:比如第10个字母有5个,要你找前10个字母组合值为40的,只需找前9个字母值分别为40-0*10,40-1*10,40-2*10,40-3*10,40-4*10相加就可以了,所以前i个字母,值为j的组合数s[i][j]=s[i-1][j-k*i],k为第i个字母的个数 ,且值j-k*i>=0.# include # include int main() {原创 2015-07-12 14:18:30 · 1748 阅读 · 0 评论 -
HDU 5319 Painter
分析:给你一个空白的图,你可以随意选几个连续的斜格子画线,\ 都是红色的,/ 都是蓝色的,每个格子只能被红线和蓝线涂一次,如何一个格子既有红色又有蓝色,就变成了绿色,给定你一个图,问至少画几条线。我们可以再拿一张"纸"g[60][60]来照着原图map[60][60]划线,每次都画能画的最长的长度。# include # include int main() { int原创 2015-07-28 19:58:11 · 514 阅读 · 0 评论 -
HDU 5214 Movie
分析:因为这题要找出3个区间,所以我们只需找到最左边的区间和最右边的区间,再遍历一下所有的区间,只要有介于这两个区间的就可以。其中最左边的区间肯定是R[i]最小的,最右边的区间肯定是L[i]最大的。需要注意的是:(1)交换左右区间是在所有的区间都生成之后才交换的.(2)定义变量用int 会 Wrong Answer,用long long或__int64 会 Memory Limit Excee原创 2015-05-14 23:14:59 · 394 阅读 · 0 评论 -
HDU 5223 GCD
HDU 5233 GCD分析:对于q个问题中,在数组ans的每个区间a[i],到b[i]之间的最大公约数是c[i],所以取ans[i]为ans[i]和c[i]的最小公倍数。 之后还要在对q个问题的答案检验一遍。# include __int64 gcd(__int64 a,__int64 b) { return b==0 ? a:gcd(b,a%b);原创 2015-05-11 21:29:12 · 412 阅读 · 0 评论 -
HDU 5301 Buildings
分析:给你一个n*m的矩形,和一个黑点(x,y),注意这个黑点不能当做空地来建窗户的,能用来建窗户的只有大矩形的4条边,这个黑点可以看做是一个1*1的实心石柱。让你最小化小矩形的面积使小矩形覆盖除黑点的n*m的大矩形,问这小矩形中面积最大的矩形。如果大矩形是边长为奇数的正方形,黑点又在正中间,那么答案就是n/2,可以画个图一下就看出来了,否则先将矩形转成n如果没有黑点的话,答案是(n+1)/2,但原创 2015-07-25 20:20:37 · 327 阅读 · 0 评论 -
HDU 5373 The shortest problem
分析:题目问最后得到的数能不能被11整除,11的倍数的特点是奇数位和偶数位的差能被11整除,知道这就好求了。# include # include char s[10]; int main() { int i,n,t,len,cas=1,sum,tem,k,s1,s2,x1,x2; while(scanf("%d%d",&n,&t)) {原创 2015-08-12 20:15:35 · 322 阅读 · 0 评论 -
HDU 2036 改革春风吹满地
分析:逆时针给你一个n边形的n个坐标,让你求面积。从第一个顶点开始和其余各个顶点相连作向量这样得到n-2个三角形,三角形abc的面积是:向量ab X 向量ac (叉积),然后把这n-2个三角形的面积累加就行了,即使存在凹多边形也没关系,应该叉积是有方向的,凹的话,结果是负的,就是减去了那凹进去的面积。# include int main() { int n,i,x[10原创 2015-08-12 20:58:54 · 422 阅读 · 0 评论 -
HDU 5387 Clock
分析:给你一个时间,让你输出3个时分,时秒,分秒的夹角。如果时间是hh(0# include # define abs(x) x>0?x:-(x); int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { int i,k,t,hh,mm,ss,h,m,s,ans[4],g[4];原创 2015-08-13 19:36:12 · 455 阅读 · 0 评论 -
HDU 5288 OO’s Sequence
分析:题意是给你n个数字,全部区间[i,j](1# include # include # define mod 1000000007# define MAX(x,y) ((x)>(y))?(x):(y)# define MIN(x,y) ((x)<(y))?(x):(y) int a[100005],l[100005],r[100005],mark[100005]; int原创 2015-07-24 20:12:56 · 455 阅读 · 0 评论 -
HDU 5289 Assignment
分析:给你n个数字,求有多少个连续的区间,满足区间内的最大值和最小值的差小于k。假如已知前n-1个数满足第n-1个数的最大区间为[i,n-1],区间内的最大值的下标为max,最小值为min,如果第n个数的值介于区间[i,n-1]的最大值和最小值之前,那么区间[x,n](i# include int a[100005]; int Max(int i,int j) { i原创 2015-07-24 20:42:47 · 398 阅读 · 0 评论 -
HDU 5344 MZL's xor
分析:给你n个元素的数组a,让你求所有(ai+aj)(1# include __int64 a[500005]; int main() { int i,n,m,z,l,ans,t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&m,&z,&l);原创 2015-08-04 19:20:22 · 400 阅读 · 0 评论 -
HDU 5347 MZL's chemistry
分析:输入两个数字,让你比较这两个数字所代表的原子序数的第一电离能的大小,保证输入的两个数字的原子序数为同一主族或同一周期。第一电离能的规律为,同主族自上而下依次递减,同周期自左而右大致递增,特例为第3主族的比第2主族的小,第6主族的比第5主族的小,因为当核外原子轨道达到全满或半满的状态时,原子的能量较低,第一电离能较大,知道了这些就好办了,看代码:# include int main()原创 2015-08-04 19:31:53 · 861 阅读 · 0 评论 -
HDU 5349 MZL's simple problem
分析:给你n个操作,1 x :代表在数组中加入元素x,2 :代表删除最小元素,3 :代表输入最大值。删除时,就算我们的数不是最小的也可以,它也不知道,只要不是最大的就行,当数组内的数为0时,就重新初始化最大值,每加入一个数就和最大值判断。# include int main() { int i,n,num,t,x,max; while(scanf("%d",&原创 2015-08-04 19:41:46 · 390 阅读 · 0 评论 -
HDU 5339 Untitled
分析:给你数a和b1...bn,求在b1.....bn中选最少的数使a%c1%c2...=0。因为b数组最多就20个,可以暴力枚举所有情况,如果给出的数bi>a,就可以把这个数删掉了,枚举的时候要把大的数排在前面,不然先mod一个小的数再mod一个大的数,大的数就没用了。# include # include using namespace std; int n,ans,b[20]原创 2015-08-15 21:55:23 · 404 阅读 · 0 评论 -
HDU 5328 Problem Killer
分析:给你n个数字,判断最长的连续等差数列的数或等比数列的数的个数有多少个。等差:a[n]+a[n-2]=2*a[n-1],等比:a[n]*a[n-2]=a[n-1]*a[n-1],要注意的是判断时要分开判断,否则会WA,比如1 2 4 6,要是一起判断的话就错了。# include __int64 a[1000010]; int main() { int i,j,n原创 2015-07-31 15:03:04 · 391 阅读 · 0 评论 -
HDU 5375 Gray code
# include # include int main() { int i,n,t,k,ans,cas=1,a[200005],min; char s[200005],c; scanf("%d",&t); while(t--) { scanf("%s",s+1); n=strlen(s原创 2015-08-12 20:30:25 · 497 阅读 · 0 评论