![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
hdu
sad
qq_45992231
这个作者很懒,什么都没留下…
展开
-
HDU 1237 求一个连通图中的哈密顿回路数(同一个状态下的哈密顿回路数)
哈密顿回路的具体形状不同,但是同一个状态下,不同的哈密顿回路的个数是相同的n个结点,各个结点间都是想通的,所以有(n-1)*n/2条边。每走一次都需要(也只需)n条边才能经过n个顶点,所以答案是(n-1)/2,即((n-1)*n/2)/n=(n-1)/2。#include <iostream>using namespace std;int main(){ int n; while(cin >> n && n) cout转载 2021-09-09 15:38:13 · 307 阅读 · 0 评论 -
HDU 2899 二分
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");#define MOD 1000000007//快速打印一个数组#define ll long long#define NUM 1000#define d原创 2021-09-08 19:55:46 · 33 阅读 · 0 评论 -
HDU 3283 求比一个排列大的第一个排列
以279134399742为例第一步找到末尾的上升序列99742 它的前一个数3就是要变换的数第二部在上升序列99742中找到第一个比3大的数 也就是4 然后交换3和4交换3和4后变为279134499732将99732逆序得279134423799#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#原创 2021-09-08 19:45:10 · 41 阅读 · 0 评论 -
HDU 2266 在一串数字中添加“+““-“使得等式成立 dfs
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");#define MOD 1000000007//快速打印一个数组#define ll long long#define NUM 1000using nam原创 2021-09-08 19:06:46 · 69 阅读 · 0 评论 -
HDU 4472 Count 求n个结点有多少个平衡的树 dp
这里平衡的定义是 同一高度的结点具有相同个数的子节点,还要注意有些图是同构的以n=6进行思考当最高结点的子结点只有一个时,那要使5个结点构成平衡的,种数就是f(5)当最高结点的子节点有两个时,要使4个结点构成的两颗子树,及整棵大的树是平衡的,必然这两颗子树要是一样的,这两颗子树的结点数也要相同所以就是f(6-1/2),即f(2.5)而2.5又不是整数,所以此种情况下不能构成平衡的同理最高结点的子节点有3个时,每颗子树的结点个数就是(6-1)/3=5/3 也不行同理一直分析到子节点的个数有5个就可以原创 2021-09-07 20:12:53 · 57 阅读 · 0 评论 -
HDU 2566 统计硬币 暴力枚举
注意a+b<=n这个条件#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");//快速打印一个数组#define ll long long#define NUM 1000#define MOD 1000原创 2021-09-07 19:17:55 · 65 阅读 · 0 评论 -
HDU 4642 博弈
题意:Alice和Bob中玩游戏,给你一个n*m的矩阵,由0和1组成,每次选择一个1,将当前位置(x,y)与(n,m)组成的矩阵都纤维相反的0->1,1->0Alice先开始,谁先组成0矩阵就胜利无论谁翻转,都会改变最后一个位置的值,所以只考虑最后一个点,有0和1两种情况,其中必然有一个必胜点,当是1时,Alice将其变为0,所以为1为必胜点只要判断最后一个位置就可以了。。。#include"stdio.h"#include"string.h" int main(){ int转载 2021-09-07 18:31:00 · 38 阅读 · 0 评论 -
HDU 2689 求逆序对 归并排序 树状数组
归并排序void merge(int a[], int p, int q, int r) //[p,q] [q+1,r]{ int* left = (int*)malloc((q - p + 1) * sizeof(int)); int* right = (int*)malloc((r - q) * sizeof(int)); for (int i = 0; i < q - p + 1; i++) { left[i] = a[p + i]; } for (int i = 0; i原创 2021-09-02 12:37:50 · 53 阅读 · 0 评论 -
HDU 5640 递归
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");//快速打印一个数组#define ll long long#define NUM 100#define MOD 1000using namespace原创 2021-09-02 10:57:55 · 54 阅读 · 0 评论 -
HDU 1399 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");//快速打印一个数组#define ll long long#define NUM 100#define MOD 1000using namespace原创 2021-08-31 15:34:05 · 45 阅读 · 0 评论 -
HDU 4554 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");//快速打印一个数组#define ll long long#define NUM 100#define MOD 1000using namespace原创 2021-08-31 14:57:59 · 60 阅读 · 0 评论 -
HDU 2616 Kill the monster DFS
原本是想用dp来解,怎么弄也弄不出来 然后看了网上的 发现要用dfs来解,这也是由于这里n较小的缘故然后为什么不能用dp来解 是因为,考虑序列(A1,M1)(A2,M2)……(An,Mn)假设在(n,m)的情况下最优的解为(Ab1,Mb1)(Ab2,Mb2)……(Abn,Mbn)则去掉了(Abn,Mbn)之后(Ab1,Mb1)(Ab2,Mb2)……(Abn-1,Mbn-1)是(n-1,m-t)的最优解 可由反证法得到。但是这仅仅说明在在以上序列(A1,M1)(A2,M2)……(An,Mn)的情况下是满原创 2021-08-31 14:50:23 · 65 阅读 · 0 评论 -
HDU 2512 把n个人分组 有多少种分法 贝尔数*
具体说来就是分成1组,分成2组,分成3组……分成n组的数量全部加起来设m[i]表示分成i组的有多少人 dp[i]表示当n=i的时候的分法则当多出一个i时,这个i可以和别人一组,也可以自己一组自己一组的分法有dp[i-1]个,和别人一起的分法根据分成k组有m[k]个分发,则就有km[k]个分发法(对于m[k]中的每个分法,第i个可以到k组里的任意一个)所以dp[i]=dp[i-1]+sigma(km[k])(k:1->i-1)然后就维护m数组,只要照上面的意思维护就可以了m[k]=i*tem原创 2021-08-29 19:27:16 · 463 阅读 · 0 评论 -
HDU 4256水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#include<vector>#define ENTER printf("\n");//快速打印一个数组#define ll long long#define NUM 100using namespace std;//构造函数 析构函数怎原创 2021-08-29 12:45:07 · 55 阅读 · 0 评论 -
HDU 6195 cable cable cable
题目要让任选k个显示器,每个显示器都和不同的source连接,也就是没有两个显示器连在同一个source上,考虑k个显示器,这样连接的话需要有k条电缆,剩下的有m-k个显示器,每个显示器都要与k个source连接 所以一共是k+(m-k)*k条电缆#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#includ原创 2021-08-29 12:34:22 · 67 阅读 · 0 评论 -
HDU 1211 逆元 快速幂
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;ll p, q, e, l;ll n, fn;int t;void exgcd(ll a, ll b, ll&原创 2021-08-26 14:47:06 · 63 阅读 · 0 评论 -
HDU 1846 巴什博弈水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;int t;int n, m;int main(){ scanf("%d", &t); while (t-原创 2021-08-26 13:51:27 · 68 阅读 · 0 评论 -
HDU 5007 字符串匹配 BF KMP KMP改进*
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;char str[50];const char s1[] = "Apple";const char s2[] = "iP原创 2021-08-26 13:46:52 · 96 阅读 · 0 评论 -
HDU 2082 母函数
注意一下if(k+j<=50)不能忘#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;int x[50 + 1];int temp[50 + 1];int num原创 2021-08-25 15:52:20 · 66 阅读 · 0 评论 -
HDU 2178 猜数字
首先猜的次数n和要猜的数的关系是n=floor(log2m)+1即n-1=floor(log2m)则n-1>log2m-1->n>log2m->m<2n 所以去2^n-1即可#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");原创 2021-08-25 15:11:04 · 58 阅读 · 0 评论 -
HDU 1214 在圆环上交换相邻位置 使逆序
在直线上移动很简单,类似于冒泡排序的方法,一个数不断向上冒,直到最终位置。不难得到其需要移动的次数公式为n*(n-1)/2。其中n为总点数。那么在圆环上移动又会如何呢?应该会不一样这是我们直观的感受。事实也是如此,移动的过程是将圆环分为两段,分别移动。那么又在何处分段呢?答案是尽量使两段长度相等。为啥?证明如下:设n为总长度,分为两段,长度分别为a、b。总次数=a*(a-1)/2+b*(b-1)/2=a*(a-1)/2+(n-a)(n-a-1)/2=(2a2-2*n*a+n2)/2。其中n为常量,转载 2021-08-25 14:58:45 · 101 阅读 · 0 评论 -
HDU 2123 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;int t;int n;int main(){ scanf("%d", &t); while (t--)原创 2021-08-25 14:20:01 · 52 阅读 · 0 评论 -
HDU 1725 Find minimal sum
题目中所说的每一个正整数都可以表示成m = An-1(n-1)! + An-2(n-2)! + An-3(n-3)! + … + A1, (0<=Ai<=i, j =1, 2, …, n-1)的形式实际上有点这个意思一个正整数总可以表示成n-1为数,从低位到高位的权分别是1!,2!,3!……贪心就行了12的阶乘是小于232的最大阶乘#include <iostream>#include<stdio.h>#include<algorithm>#原创 2021-08-25 14:16:25 · 50 阅读 · 0 评论 -
HDU 4349 Lucas定理
先简要介绍Lucas定理:A、B是非负的整数,p是质素,将A写成p进制数a[n]a[n-1]…a[0],将B写成p进制数b[n]b[n-1]…b[0],C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])C(a[n-2],b[-2])…*C(a[0],b[0])模p同余。本题求奇数的个数,即要判断C(n,m)的奇偶性,:使用Lucas定理推导,我们分析一下 C(n,m)%2,那么由lucas定理,我们可以写成二进制的形式观察,比如 n=1001101,m是从000000到10011转载 2021-08-25 13:59:22 · 62 阅读 · 0 评论 -
HDU 1398 母函数
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;int n;int x[300 + 1]; //存放结果系数int temp[300 + 1];//存放中间系数i原创 2021-08-24 13:12:57 · 41 阅读 · 0 评论 -
hdu 1028 母函数*
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");#define ll long longusing namespace std;int n;int x[120 + 1]; //存放结果系数int temp[120 + 1];//存放中间系数i原创 2021-08-24 12:55:49 · 71 阅读 · 0 评论 -
HDU 5074 相邻数和 dp思维
一开始想不到是用动态规划来做,网上搜了一下才发现要用dp首先很容易想到dp定义的状态是dp[i],表示前i个数的最大值但是很快发现由dp[i-1]并不能得出dp[i]可以考虑3个的情形,假设第一个是确定的1,我第二个选择第一行里最大的假设是5第三个选择第5行里最大的假设是2,则和是7但是我第二个可以选择第一行里不是那么大的,假设是4,第三个选择第4行李最大的假设是5,则和是9也就是说dp[2]显然是6,但是我并不能从6(1,5)来推出9,显然还要有其他信息,这个信息就是放上去的这个数字,所以设d原创 2021-08-23 13:34:57 · 90 阅读 · 0 评论 -
HDU 4278 Faulty Odometer 八进制转为十进制
这题意思看了好多遍没看懂以为是只能用2,3,4,7,8,9来表示结果是用0,1,2,4,5,6,7,9,来表示那用这种方法表示的数15为什么是120->1->2->4->5->6->7->9->10->11->12->14->150->1->2->3->4->5->6->7->8 ->9-> 10->11->12如果我们把0 1 2 4 5 6 7 9原创 2021-08-23 10:23:03 · 58 阅读 · 0 评论 -
HDU2077 汉诺塔变式
这道题涉及两个汉诺塔变式首先传统的汉诺塔只要求大的不能放在小的上,称其为c0c0hano(n,a,b,c) //a处的n个盘子借由b移动到c{c0hano(n-1,a,c,b)//a处的n-1个盘子借由c移动到b把最大的盘子移动到cc0hano(n-1,b,a,c)//b处的n-1个盘子借由a移动到c}这道题里涉及的第一个汉诺塔变式称其为c1,c1除了c0里的要求,还要求不能直接把左边的盘子移动到右边,也不能直接把右边的盘子直接移到左边,所以c1的伪代码要注意从左边移动到右边的,必须先原创 2021-08-22 15:05:31 · 154 阅读 · 0 评论 -
HDU4403 DFS
这题字符串的长度小于15,所以才可以用暴力搜索很容易想到的是先枚举等号的位置 因为只有一个等号枚举完等号位置时,该如何进行+的操作的呢由于这题还要计算i到j的字符所组成的数字,所以可以这样枚举每次dfs中枚举当前的数字是i到i,i到i+1,i到i+2,……学习这样的dfs方法#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<原创 2021-08-22 13:13:23 · 50 阅读 · 0 评论 -
HDU 6077
思路:题目是给了一张字符画,然后让你识别出其中的数字并且输出。我们观察一下这个图,这种“8”字形的数字一共有7条边,每条边有两个X,所以我们观察从0~9这十个数发现。我们可以确定1,4,7,8这四个数字的X的个数,对于其他的情况分别讨论:标记一下然后观察图发现四个数字所处的位置:(0,0)~(6,3)(0,5)~(6,8)(0,12)~(6,15)(0,17)~(6,20)我们把这四个区域遍历一遍,找特征就行代码:#include <cstdio>#include转载 2021-08-22 11:43:08 · 53 阅读 · 0 评论 -
HDU 4452 模拟题
模拟就行 注意提前规划好,注意细节与细心#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");using namespace std;int n;int dx[4] = { -1,1,0,0 };//0代表North,1代表South,2代表West,3代原创 2021-08-21 19:02:04 · 52 阅读 · 0 评论 -
HDU 4861 费马小定理,原根
原根什么的不知道啊#include <stdio.h>#include <string.h>#include <algorithm>using namespace std; int main(){ int k,p; while(scanf("%d%d",&k,&p)!=EOF) { if((k/(p-1))%2==1) printf("YES\n"); else pri转载 2021-08-21 13:40:05 · 101 阅读 · 0 评论 -
HDU 2309 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");using namespace std;int n;int score[100];int main(){ while (scanf("%d", &n) != EOF) { if (!n原创 2021-08-21 12:59:50 · 42 阅读 · 0 评论 -
HDU 4968枚举 分组背包 动态规划*
枚举#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>#define ENTER printf("\n");using namespace std;int t;int average;int n;int a, b, c, d, e;double total;int main(){ scanf转载 2021-08-21 12:51:07 · 44 阅读 · 0 评论 -
HDU 1712 分组背包
分组背包和01背包十分相似,设dp[i][j]表示前i组物品放入容量为j的背包里所能获得的最大价值,则从dp[i-1][j]来得到dp[i][j] 因为可以拿一组里的任意一个,所以循环k为每组里的物品的下标if(第k项物品的代价大于j)dp[i][j]=dp[i-1][j]elsedp[i][j]=max(dp[i-1][j],dp[i-1][j-c[k]]+v[k])然后这题要注意将物品,背包,组这些词转换一下就行了#include <iostream>#include<原创 2021-08-20 15:22:56 · 145 阅读 · 0 评论 -
HDU 4716 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>using namespace std;#define ENTER printf("\n");int t;int n;int main(){ scanf("%d", &t); for(int j=1;j<=t;j++) { sca原创 2021-08-18 13:21:54 · 45 阅读 · 0 评论 -
HDU 2398 公式推导,向上取整 向下取整 四舍五入 log函数换底公式
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>using namespace std;#define ENTER printf("\n");double balance;double rate;double target;int main(){ while (scanf("%lf%lf%lf",原创 2021-08-17 16:53:43 · 164 阅读 · 0 评论 -
HDU 2734 输入带空格的字符串,计算一个字符串所代表的值 水的嘛就不谈了
#include <iostream>#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define ENTER printf("\n");char str[1000 + 1];int main(){ while (gets(str)) { if (strcmp(str, "#") == 0) break; int len =原创 2021-08-17 16:39:20 · 34 阅读 · 0 评论 -
HDU 2515 从任意两数和的数表倒推 代码的实现*
分析(来自黑书):为了研究方便,设这n个整数从小到大依次为A1,A2,A3,…,也将n(n-1)/2个和数从小到大依次设为K1,K2,K3…从边缘数据入手,根据简单的大小比较,很容易发现A1+A2=K1,A1+K3=K2。因为无法直接确定A2+A3的大小(因为K3有可能等于A1+A4或A2+A3),所以只能假设A2+A3 = Kx,然后通过解方程求出A1,A2,A3的值。知道A1,A2,A3以后,接下来的工作就是依次递推出每个数。假设已经求出前w个数的值,并将相应的w(w-1)/2个和数从数列{K转载 2021-08-17 15:45:24 · 49 阅读 · 0 评论