HDU100系列
陈末iiiiiiiiiiii
Retired
展开
-
HDU2082 母函数模板题 终于Ac了啊啊啊啊啊啊
题目链接题解思路直接用母函数把幂次小于等于 50 大于0的 系数全加起来即可。有关母函数 和 多项式乘法 的证明和讲解见 链接AC代码#include <bits/stdc++.h>using namespace std;#define ll long longint a[30];ll tmi[200];ll ans[200];int main(){ int t; cin>>t; while(t--) { me原创 2021-05-07 12:16:58 · 65 阅读 · 0 评论 -
HDU 2079 组合数学-母函数 多项式乘法求系数 初始化1
题目链接题解思路有关母函数的理解,我看了好久的博客,终于翻到一位能让我看明白的大佬的博客 地址幂次就是方法的权重,而系数就是该权重的方法总数!现在就是解决多项式乘法求系数的问题了。用3层循环,最外层记录现在处理的括号是哪个,中层循环,对应每个要被乘的幂次,内层循环处理括号内每个数和幂次相乘求出系数。中层还要有临时数组给最终数组输入值,再将临时数组清除。(因为在求幂系数的时候需要最终数组原有的系数再加上新增的系数,这样只能多取一个数组)有一点关键的是在求系数是要个幂次为0的系数初始化值为1, 不原创 2021-05-07 11:53:13 · 245 阅读 · 0 评论 -
HDU2068 RPG的错排 组合数加上错排公式
题目链接题解思路找错的人一定小于人数的一半,总人数总选出这些人用组合C,两个相乘就是答案了。然后再累加出总数即可。错排公式cu[i] = cu[i-1]*(i-1) + cu[i-2] ;下面代码我不知道为何WA,我认为是对的,而且两个编译器不同的答案真是离谱。。AC代码#include <bits/stdc++.h>using namespace std;#define ll __int64ll cu[21];ll zuhe (int a,int b){ ll原创 2021-05-06 20:33:44 · 55 阅读 · 0 评论 -
HDU2067 组合数学 卡特兰数 数论
题目链接题解思路有关卡特兰数的证明和应用 参考大佬的博客加上这个 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); (通常会爆数值 )这题 原本只用C n 2n 加上了限制条件为不能越界 但是答案还是必须 x的选择个数和 y的相同根据卡特兰数 C n-1 2n 就是 其中 X大于或者小于Y的个数 减去 再加倍即可得出答案 因为从左下方和右上方是等价的。AC代码模拟组合数#include <bits/stdc++.h>using namespac原创 2021-05-06 19:42:24 · 97 阅读 · 0 评论 -
HDU2065 “红色病毒“问题 指数型母函数 泰勒级数 快速幂 总得面对难题
题目链接题解思路看到这题真的毫无思路,翻翻题解出来给泰勒级数直接把我劝退去做99题去了。 总要面对的。参考 大佬的博客对指数型母函数的处理。AC代码#include <bits/stdc++.h>using namespace std;#define mod 100#define ll long longll kuai(ll di,ll mi){ ll ans = 1; while(mi) { if(mi & 1)转载 2021-05-06 17:11:36 · 136 阅读 · 0 评论 -
HDU2077 汉诺塔Ⅳ 看懂题目的重要性 没看懂题目卡了好几天
题目链接题解思路题目意思 最终答案还是要和汉诺塔Ⅲ相同在原版汉诺塔的规则上加两点 不能一次移动两格(1到3 或3到1 都不行 要借助2)特例 最大的那个盘中可以放在小的上面 做完汉诺塔Ⅲ我们有第一个规则的递推式 即a[i] = a[i-1]*3 + 2 ; 记住此时f(n)的规则是将N个由A 到 C放置 或者逆 所以f(n-1)在下面的规则也是一样的先将f(n-1)放到C 再将 第n个由 A 放到 B 然后将f(n-1)放到 A 再将 n 放到 C再将 f(n-1) 放回 C原创 2021-05-05 17:31:54 · 89 阅读 · 0 评论 -
HDU 2072 单词数 set去重 C++的输入输出控制类 istringstream
题目地址链接题解思路很明显可以用string的set来去重,直接输出size就可以。先用gets或者getline来输入一行 怎么将一行的信息快速处理呢?也可以用find寻找里面的空格 这里要讲的是 istringstream函数举个例子 string str="i am a boy"; istringstream is(str); string s; while(is>>s) {原创 2021-05-04 15:42:24 · 122 阅读 · 0 评论 -
HDU 2089 itoa() 和strstr()的运用 字符串
题目题题解思路利用下面两个函数快速判断即可。cstringstrstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置的位置;否则,返回NULLcstdlibitoa(整型数据,目标字符串,进制) 把整型数字转换成字符串存储在数组中AC代码#include<iostream>#include<cstring>#include<cstdlib>using name原创 2021-05-01 20:39:09 · 65 阅读 · 0 评论 -
HDU 2095 寻找唯一的奇数 异或运算 两两抵消的异或运算
题目链接题解思路odd times 奇数这题输入量极大,想重复扫描显然是不行的。不过排序后寻找也是可以AC的,这样只需扫描一次,排序一次,寻找到后直接break;但是用异或只需几行代码就可以了,异或运算就是碰到相同的会抵消,这样我们甚至可以在线处理,边导入边异或。AC代码#include <iostream>using namespace std;int main(){ ios::sync_with_stdio(0); //解绑scanf cin起飞代码原创 2021-05-01 18:50:51 · 124 阅读 · 0 评论 -
HDU2098 分拆素数和 欧拉筛的运用
题目链接题解思路暴力也可,但是可以运用欧拉筛。顺便学了一波欧拉筛,没学明白!(prime数组记录每个素数的位置,number数组判断是否是素数)先筛出素数,再找出离这个数最大的素数在哪里,然后枚举即可。AC代码#include <bits/stdc++.h>using namespace std;int main(void){ bool number[10001]; int prime[10001], count = 0; memset(number, true, size原创 2021-05-01 17:58:23 · 79 阅读 · 0 评论 -
HDU 2064 汉诺塔三 变种汉诺塔 递推 DP 也有递归思路(待补)
题目链接题解思路递推思路:设三个点为A B C设将n层塔从A经B挪到C需要f[n]步。那么移动过程可以这样看:先将上面n-1层从A经B挪到C需要f[n-1]步,再将第n层从A挪到B,需要一步,再将上n-1层从C经B挪到A,需要f[n-1]步,再将第n层从B挪到C,需要一步,再将上n-1层从A经B挪到C,需要f[n-1]步,总计3f[n-1] + 2步,其中 f[1] = 2;于是有 a[i] = 3a[i-1] + 2递归思路暂时还看不懂,我是废物AC代码#include &原创 2021-05-01 15:11:12 · 167 阅读 · 0 评论 -
HDU 2062 Subset sequence 找到一些规律 爆搜又是TLE 难想
题目链接题解思路参考大佬的博客每个对应的N 所有的子集数是f(n) = n*( f(n-1) + 1 ),f(1)=1;设g(n)是每一组子集的个数,g(n)=f(n)/n。结合上式得 g(n)=(n-1)*g(n-1)+1这样的话我们可以一位一位输出,即根据M的大小判断此时的数在哪个子集,然后输出这个输再把剩下的输看成新的集合把数字替换了,再循环判断输出。大佬的思路是真的巧妙啊AC代码#include <bits/stdc++.h>using namespace s原创 2021-05-01 13:56:42 · 83 阅读 · 0 评论 -
HDU 2059 龟兔赛跑 DP中多阶段决策的 典型例题 看了讨论区才写出来
题目链接题解思路这道题目是DP中多阶段决策的典型例题我们将起点和终点划分到N个加电站中去这样一共有N+2点,用DP[i]表示到第i个加电站的最小耗费时间那么在求DP[i]的时候,DP[0]…DP[i-1]已经求得让j从0遍历到i-1,每一个j表示最后一次充电到i点那么状态转移方程为DP[i] = min(DP[j] + t(j, i),DP[i]))//t(j, i)表示从j充完电一直到i点(中途没有充过电)以上是讨论区的解析,我感觉这也算是一种穷举思想,枚举一个节点和他前面的每个节点原创 2021-04-30 16:17:15 · 125 阅读 · 1 评论 -
HDU2049 错排 组合数 递推 debug花了好久 求求你不要WA我了。
题目链接题解思路对M个新郎进行错排,然后进行组合,从N个新郎中拿出M个,即C(m,n)。组合数的计算的一个等于号差点把我搞死原来cout里面用表达式会出问题!AC代码#include <iostream>#include <cstdio>using namespace std;int main (){ long long a[30]; a[1]=0; a[2]=1; a[3]=2; for(int i = 4; i <=原创 2021-04-29 21:28:18 · 68 阅读 · 0 评论 -
HDU 2048 错排 错排 数论 组合数学 递推 做了好久好久
题目链接题解思路对于递推的题 我们在找关系式的时候一定要找那些不变的量n个人n个票,问所有人都拿错票的方法数?n个人全都拿错即错排可以描述为f(n),那么它的来源必定是两种可能 :第一种:前n-1个人已经错排那么必然第n个人拿的他自己的票。第二种:第n个人拿的不是自己的票,那么必然前n-1个人之一的票被第n个人拿着。对于case1:只需第n个人的票与前n-1人之一互换,n个人均能成错排,有f(n-1)(n-1)种方法。对于case2 :因为第n个人拿着前n-1人当中某一人的票,那么只能和除原创 2021-04-29 20:06:03 · 86 阅读 · 0 评论 -
HDU2047 EOF牛肉串 神奇的递推 两种巧妙的思想 真的想不出啊
题目链接题解思路知道这是递推题但是递推方程怎么求呢?两种思路一长度为n的牛肉串,第n个节点分两种情况,为O与非O如果第n个节点非o,那么第n-1个节点随便啥样都可以,此时前n-1个节点的排序方式假设为f(n-1),由于第n个节点非o,即只能为E或者F,所以对应独立的两种情况,n个节点总共的排序一共就是2倍f(n-1);另一方面,如果第n个节点为o,那么第n-1个节点不可以为o,这说明第n-2个节点随便取啥都可以,前n-2个节点的排序方式假设为f(n-2)。第n-1个节点不是E就是F,那么前原创 2021-04-29 17:12:27 · 109 阅读 · 0 评论 -
HDU 2046 骨牌铺方格 隐藏的斐波那契 动态规划 递推 画图找规律
题目链接题解思路一开始没思路想了很久,以为是排列组合,往后画了几个找到了规律。我们先定义 这种组合为2这种为 1画了几个后发现规律,N个无非就是从全部N-1的情况后面添1再加上在全部N-2情况后添2,这样就能有所有情况了。可以看出这是个斐波那契数列。实在想不出可以画图找找规律,对于这种递推的题目。AC代码#include <bits/stdc++.h>using namespace std;long long a[60];int main (){ a[1]=原创 2021-04-29 16:32:05 · 120 阅读 · 0 评论 -
HDU 2045 RPG难题 涂格子 递推 动态规划 挺难想的
题目链接题解思路很容易看出一开始是按n=(n-1)*2递推的 这样的话我们只要找出 第n种中与第一个格子相同的情况减去即可。经过一番操作,我理所当然的认为 n-1就是答案,这样就大错特错了 。 for (int i =3; i< t ;i++) a[i]=a[i-1]*2; //递推求n-1 a[t]=a[t-1];这个思路是错的啊 当第一个格子和最后一个格子相同时,并不是n-1个格子的染法总数啊,因为并没有考虑n-1个格原创 2021-04-29 11:15:45 · 90 阅读 · 0 评论 -
HDU2044 小蜜蜂 斐波那契动态规划
题目链接题解由于蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。容易得出转移方程为 a[i]=a[i-1]+a[i-2]; 正好是斐波那契。然后以起点为1 起点加1也为1 用转移方程干到 目标点就好了AC代码#include <bits/stdc++.h>using namespace std;long long a[60];int main (){ int t; while(cin>>t) { wh原创 2021-04-29 09:59:32 · 71 阅读 · 0 评论 -
HDU2036 高数下的叉乘运算 求 多边形面积 数论 拿起高数书才写出来
题目链接题解思路很明显可以拆分成多个三角形进行计算。一开始想用海伦公式,但是要求直线长度还是算了,太容易损失精度了。然后看讨论区发现竟然能用叉乘来解决。公式差不多这样 列出课本里的叉乘行列式就可以得到假设p1(x1,y1),p2(x2,y2),p3(x3,y3)int x = x2-x1;int y = y2-y1;int x ‘ = x3-x1;int y ‘ = y3-y1;S = x * y ’ - x ‘ * yAC代码#include <bits/stdc++.h&原创 2021-04-28 20:45:10 · 184 阅读 · 0 评论 -
HDU2035 人见人爱A^B 数论 快速幂 究极位运算优化版
题目链接题解利用快速幂进行快速运算并对1000去模位运算优化版快速幂int kuaisumi(int di,int mi,int mo){ int ans=1; while(mi) { if(mi & 1) //相当于mi %2==1; { ans=ans*di%mo; } di=di*di%mo; mi >>= 1; //相当与 mi/=2;原创 2021-04-28 20:01:37 · 81 阅读 · 0 评论 -
HDU2054 A == B ? 终于来补的一道模拟题 纪念一下 只要敢模拟模拟题就是弟弟
题目地址链接题解思路不断根据 前面多0 后面多0 有无小数点 进行测试模拟 不断debugAC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std ;const int maxn = 1e5;char a[maxn];char b[maxn];int main(){ while(cin&g原创 2021-04-27 21:38:21 · 83 阅读 · 2 评论 -
HDU2050 折线分割平面 欧拉定理 数论
题目题目地址题解思路根据欧拉定理有结论 每增加一条直线,对平面数增加的贡献值,是其与先前直线的交点数(不包括与已有交点重合的点)+1 第N条折线最多可以产生4*(n-1)个交点 所以有递推式 a[i]=a[i-1]+4(i-1)+1;*这题差不多就解决了,欧拉定理牛逼!AC代码#include <iostream>#include <cstdio>using namespace std;int a[10005];int main (){ a[1]=原创 2021-04-27 18:56:31 · 116 阅读 · 0 评论 -
HDU 2058 The sum problem 数论 等差数列 不等式的运用 没接触过是真的想不出这个不等式
题目题目地址题解思路可以很明显看出这是个等差数列,我们有对应的求和公式可以用,但是公式里面包含了首项和长度N,如果直接枚举N必然超时。这是就有个巧妙的不等式限制了N的范围,因为首项为1,所以Sn=n+(n-1)n/2=(n+1)n/2,令M=Sn,N为项的个数,则N<=n(max)=sqrt(Sn2)=sqrt(M*2); 这里的n+1忽略是因为int相除会损失精度的就使得不等式完全成立!妙啊当N被确定时,用公式a1*N=Sn-(N-1)N/2求出后判断a1是否是个整数即可!此题不太容易原创 2021-04-11 13:43:41 · 79 阅读 · 0 评论 -
HDU2063 过山车 洛谷P3386 图论 最大分配 二分图 匈牙利算法 注意分清有向和无向图
题目HDU链接洛谷链接题解思路首先要了解二分图最大匹配的算法。这里讲的是匈牙利算法,利用深搜对每个节点进行搜索,询问是否可以连接或者让已连接的对方换一个节点连接。代码实现,时间复杂度 节点数n成关系数m O(nm)int dfs(int x){ for(int i= nv+1; i<= na+nv ;i++) { if(book[i] == 0&& mp[x][i] ==1) { book[i]=1原创 2021-04-27 17:32:42 · 107 阅读 · 0 评论 -
HDU 2094小明和乒乓球 迷惑并查集 STL set 集合的妙用
题目小明正在看乒乓球比赛,比赛规则是每场比赛两个人对打,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。输入含有一些选手群(多组输入),每群选手都以一个整数n(n<1000)开头,后跟n对选手的比原创 2021-03-29 23:50:03 · 99 阅读 · 0 评论 -
HDU2084 数塔 动态规划 模板 自下而上和自下而上
题目地址题解思路解法一考虑到答案一定存在,而且从子层数也必定最大(最优解的子情况也最优 也就是说 n-1 到 n 的最大值选择的数 和 1到 n的最大值选择的数重合 )这样我们只需从最大层开始向上递增 每次对每个点的下一层中选择最优的 也就是for(int i=r-1;i>=1;i--) for(int j=1;j<=i;j++) { ta[i][j]=max(ta[i+1][j],ta[i+1][j+1])+ta[i][j];原创 2021-04-26 18:42:18 · 125 阅读 · 0 评论 -
HDU2037 今年暑假不AC 有关时长最长的 贪心 被书里伪代码坑死了
题目地址题解思路这种题只要记住每次取最早结束的节目这个结论就能AC了,但是书里将开始时间和结束时间用pair映射然后排序的操作在编译器实现不了,正常操作应该是用结构体把两个时间存到结构体数组里去,在进行cmp结构体排序的函数定义然后sort就能排序出每次最早结束的时间了。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include &原创 2021-04-11 11:42:59 · 75 阅读 · 0 评论