![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
51nod
h_tour
这个作者很懒,什么都没留下…
展开
-
51nod 1350 斐波那契表示
题目链接参考链接题解:没有思路先打表观察,可以发现函数f[i]f[i]f[i]有规律,会出现斐波那契数列式分层:1 12 13 1 24 1 2 25 1 2 2 2 36 1 2 2 2 3 2 3 37 1 2 2 2 3 2 3 3 2 3 3 3 4可以发现前nnn项的和可以预处理其中的一部分,由于斐波那契数列增长速度接近指数,因此所需要的数组大小不会超过100。剩余的数可以依据一定的规律进行处理。实现细节见代码:#include <bi原创 2021-04-09 18:09:15 · 80 阅读 · 0 评论 -
51nod 1670 打怪兽
题目链接题解:因此前一轮和后一轮的关系密切,可以使用递推解决。令dp[i]dp[i]dp[i]表示第iii轮依然存活时的方案总数,此时的能量一定是iii。显然dp[0]=n!dp[0]=n!dp[0]=n!,因为,无论怪物怎么排列,第0轮一定是存活的。我们找到现在能够打败的怪物数量xxx,其中这些怪物已经被打败的是iii个。因此,此时我们可以求出第i+1i+1i+1轮我依然存活的概率是x−in−i\frac {x-i}{n-i}n−ix−i,只要将这个概率乘上dp[i]dp[i]dp[i],我原创 2021-03-31 19:05:05 · 85 阅读 · 0 评论 -
hdu 5698 瞬间移动
题目链接题意:从左上角开始移动,每次可以选择右下方的一个格子移动过去,求到第nnn行mmm列的格子的方案数。题解:枚举到(n,m)(n,m)(n,m)总共需要移动的步数kkk。那么容易发现kkk步走到(n,m)(n,m)(n,m)的方案数其实就是Cn−2k−1∗Cm−2k−1C_{n-2}^{k-1}*C_{m-2}^{k-1}Cn−2k−1∗Cm−2k−1,预处理阶乘和逆元可以很快做出这题。实现细节见代码:#include <bits/stdc++.h>using names原创 2021-03-31 17:57:23 · 91 阅读 · 0 评论 -
51nod 2463 旅行
题目链接题意:给定mmm条无向边,可以随机一个点出发,按照无向边走完所有的城市,到了每个城市之后,可以有两种选择:选择一条与当前城市相连的道路,走向一个没有去过的城市沿着第一次访问该城市时经过的道路后退到上一个城市当回到起点时,可以选择结束这次旅行或继续旅行。在每到达一个新的城市(包括起点)时,将城市的编号记录下来,这样会形成一个长度为nnn的序列,请输出字典序最小的序列。题解:题目当中的数据只给了m=n−1m=n-1m=n−1或者m=nm=nm=n这两种情况。由于起点可以自由选择,因此我原创 2021-03-20 18:50:51 · 83 阅读 · 0 评论 -
51nod 1255 字典序最小的子序列
题目链接题意:给我们一个字符串SSS,让我们从中找到一个子序列满足以下两个条件:包含字符串中所有出现过的字符各1个。是所有满足条件1的串中,字典序最小的。题解:这题可以使用栈解决。对与还没当前...原创 2021-03-20 16:21:24 · 162 阅读 · 0 评论 -
51nod 1625 夹克爷发红包
题目链接枚举+贪心。题意:有nnn排mmm列观众,给定这些观众现在手里的红包金额。老板现在最多还能发kkk组高级红包,每组高级红包只能同时给一行或一列的人派发,同时,每个高级红包的金额都是xxx, 每个人只能接受一个高级红包,被发高级红包的人手里的普通红包会被收走。问,怎么派发才能使所有人拿到的红包总额最多。题解:这道题目如果只能分给行或者列,直接贪心就可以解决,但是,此题既能给行又能给列。每次给了行之后,由于有每个人只能收一个高级红包,导致再给列时,原来的数组已经发生了改变,也就是每次操作其实原创 2021-03-18 18:48:24 · 55 阅读 · 0 评论 -
51nod 1163 最高的奖励
题目链接贪心,优先队列。题意:给了nnn个任务的结束时间和奖励,让我们安排做任务的顺序,使最终能够得到的奖励最大。题解:朴素做法:首先将所有的任务根据奖励的大小从大到小排序,如果奖励大小相同,结束时间晚的排在前面。贪心的策略就是,将该任务结束时间前第一个没有被安排任务的时间分给该任务。由于结束时间的数据较大,直接贪心会出错,我们发现,总共只有nnn个任务,也就是最多只需要nnn个单位的时间就可以做完所有任务。因此,我们在贪心时,将当前任务的结束时间与nnn取一个minminmin。朴素版代码:原创 2021-03-18 16:36:49 · 106 阅读 · 0 评论 -
51nod 1678 lyk与gcd
题目链接这天,lyk又和gcd杠上了。它拥有一个n个数的数列,它想实现两种操作。1:将 aia_iai 改为bbb。2:给定一个数iii,求所有 gcd(i,j)=1gcd(i,j)=1gcd(i,j)=1 时的 aja_jaj 的总和。题解:直接统计gcd(i,j)==1gcd(i,j)==1gcd(i,j)==1的和不太好下手,因此,我们从反面入手,先统计处gcd(i,j)!=1gcd(i,j)!=1gcd(i,j)!=1的和。如何得到这个和呢?我们可以采用容斥原理。首先我们将i原创 2021-03-15 15:48:38 · 71 阅读 · 0 评论 -
51nod 1103 N的倍数
题目链接前缀和+抽屉原理题意:给了一个长度为nnn的数组,从中任意找到若干个数,它们的和是nnn的倍数。题解:这里可以使用抽屉原理,模nnn的余数总共有nnn个。如果出现前缀和模nnn等于0,表明这前iii个数的和一定是nnn的倍数;反之,如果没有前缀和等于0,那么此时前缀和模nnn的余数只有n−1n - 1n−1个,因此对于这nnn个数的前缀和来说,一定会有2个前缀和模nnn的余数相同,那么在这之间的所有数的和模nnn一定等于0,也就是nnn的倍数。实现细节见代码:#include <原创 2021-03-05 16:20:37 · 46 阅读 · 0 评论 -
51nod 3038 数列求和
题目链接题意:给定两个数nnn和kkk,求∑i=1nik mod 10007\sum_{i=1}^ni^k\ mod\ 10007∑i=1nik mod 10007的值题解:容易发现直接暴力枚举的时间复杂度是O(nlogn)O(nlogn)O(nlogn),而nnn的数据范围比较大,因此暴力不行。我们可以考虑到,这里的模数10007比较小,因此,我们可以从每个数模10007的余数下手。利用这个同余,我们发现1k,10008k,20015k,…%100071原创 2021-03-04 20:08:36 · 444 阅读 · 1 评论 -
51nod 2006 飞行员配对(二分图最大匹配)
题目链接题解:用匈牙利算法找出最大匹配数即可。#include <bits/stdc++.h>using namespace std;int head[110], cnt, match[110];bool vis[110];struct E { int v, next;}e[1010];void add(int u, int v) { e[cnt].v = v; e[cnt].next = head[u]; head[u] = cnt++;}bool find(i原创 2021-02-24 17:10:58 · 57 阅读 · 0 评论 -
51nod 1257 背包问题 V3
题目链接二分单位体积的价值,然后判断是否可行。题意:给我们n个物品的体积和价值,从中选k件物品,求单位体积的最大价值是多少?题解:二分单位体积的价值,然后将原有的物品进行转换排序,选取前k件,判断是否可行。#include <bits/stdc++.h>using namespace std;const int MAXN = 5e4 + 10;int n, k;int allw, allp;struct Node { int w, p; double pw;}a[M原创 2021-02-24 14:58:38 · 69 阅读 · 0 评论