- 博客(11)
- 收藏
- 关注
原创 2021-10-14
生成字符串 太离谱了,本来以为是搜索,结果却是组合数学!!!,简单来说,就是这样:(嫖张图) 然后就相当于从(0,0)走到(n+m,n-m),不考虑限制时有C(n+m,m)种走法然后我们考虑不可以的情况,就是m少走了一步,就是C(n+m,m-1)种,所以总共就是**C(n+m,m)-C(n+m,m-1)**种,然后就简单起来了 先处理阶乘,再用快速幂计算逆元 #include <bits/stdc++.h> #define LL long long #define M 20100403 usin
2021-10-15 16:27:41
917
原创 2021-10-13
完了,不知道从哪天开始了,所以会有点长 逃亡的准备(hallows) 经典的多重背包。 #include<bits/stdc++.h> using namespace std; int n, m, V[5010], W[5010], C[5010]; int f[50010], q[50010]; int calc(int i, int u, int k) { return f[u + k*V[i]] - k*W[i]; } int main() { scanf("%d%d",&
2021-10-15 11:31:14
219
原创 2021-10-7pm
松鼠聚会 ???什么东西?,建议直接暴力枚举,然后n^2的效率告诉你过不了,于是我反手打开百度 意识到这个题是将切比雪夫距离(点它) 转成曼哈顿距离,然后就是把(x,y)变成了(x+y,x-y)要除2的,但是可能会有小数,所以先不除,就最后距离除2就ok,然后分别对每个点的x,y排序(有个前缀和),处理为递增的,然后找下标,就可以快速求距离和了 #include <bits/stdc++.h> #define LL long long #define MAXN 100005 using name
2021-10-08 11:51:08
95
原创 2021-10-7
Sightseeing Cows 首先,我们要明白,这道题可能有负环,因此,我们要用SPFA来做,别问,问就是不会,然后可以二分,因为是个0/1分数规划,所以对于任意的环,求出一个mid并且判断二者关系后就可以二分了。 **注意!!!**每次我们要建一个新图跑SPFA求最短路。(在pd()里面) #include<bits/stdc++.h> #define N 1006 #define M 5006 #define eps 1e-6 using namespace std; int n,m,c
2021-10-08 10:32:42
78
原创 2021-10-06
数学知识反素数合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 反素数 首先,该题数据范围较大,10910^9109,因此不能朴素枚举,又因为相当于是求围内约数最多的数,可以想到:n=2a×3b……n=2^a \times 3^b……n=2
2021-10-06 21:12:35
84
原创 2021-09-30
聪明的质检员 额,这道题刚开始给我整蒙了,看这数据就……会T掉。所以: 前缀和+二分: 在二分W参数的函数中计算能算入的矿石的前缀和,在w[i]>=W时这个i矿石会在统计里(若<W就不管它了直接pre[i]=pre[i-1] 矿石价值和是:pre_v[i]=pre_v[i-1]+v[i],前面的和加上当前这一个i矿石; 矿石数量和是:pre_n[i]=pre_n[i-1]+1。 就可以愉快的写出 for(int i=1;i<=n;i++){ if(f[i].val>=x)pre_
2021-09-30 16:27:38
235
原创 2021-09-28
扫雷 初看题目……熟悉而简单恶心 然后看到m=2……嗯,简单起来了还是不会啊 所以,想了个暴力……W了 (其实暴力是可以过的……因为暴力加点优化很快就能回溯的,有时暴力其实是一种好方法 然后快乐摆烂 #include<bits/stdc++.h> #include<cstdlib> #include<ctime> #define LL long long using namespace std; int random(int n){ return (LL)rand()*
2021-09-28 21:07:45
88
原创 2021-09-26
自然数拆分 完全背包??? 笑死,刚开始根本没想到,以为是组合数学 行了,既然是背包,就很简单了。 不过还是写一下数学: 转移方程: for(int j=1;j<=i;j++) f[i][j]=((LL)f[i-1][j-1]+(LL)f[i-j][j])%mod; 然后我发现书(《算法进阶》)上还有原码…… 背包的: f[0]=1; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ f[j]=(f[j]+f[j-1])%mod
2021-09-26 21:15:49
284
原创 前k大的数
笑死,如果能直接用sort,谁要学qsort 附上链接,原地学习:qsort函数使用方法总结(详细全面+代码)_嵌入式与Linux那些事的博客-CSDN博客_qsort OK,学懂了就好了 代码: #include<bits/stdc++.h> using namespace std; //priority_queue<int>q;//其实开始想用优先队列的,数据太大溢出了 int n,m,x,maxx,f[6000001]; template <typename T
2021-09-24 17:02:50
58
原创 灯泡——一个数学题
额 就是相似+对勾函数 如图 然后附上代码 #include<bits/stdc++.h> using namespace std; int n; double H,h,D,a; int main(){ scanf("%d",&n); while(n--){ scanf("%lf%lf%lf",&H,&h,&D); a=H-sqrt(D*H-D*h); if(a<0)printf("%.3f\n",D*h/H); else.
2021-09-24 16:54:27
70
原创 2021-09-24
大神排队 题目描述 现在共有n个同学要排成一列,每个同学有两个属性:影响力和承受能力。给一个同学造成的心理创伤指数等于所有在他前面同学的影响力之和减去他的承受能力。 请安排一下排队顺序,尽量使受到心理创伤最大的同学少受创伤。 输入 第1行是整数n,表示同学人数。 第2~n+1行,每行两个自然数,分别是该同学的影响力和承受能力。 输出 输出1行1个整数,为你安排的顺序中受到心理创伤最大的同学受到的创伤。 思路:(贪心) 对于所有的人,所受伤害为总伤害-自己创伤-承伤。又总伤害一定,所以就把伤害和承伤能力作为指
2021-09-24 16:34:20
612
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人