![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
深巷wls
平平无奇
展开
-
H.答疑(C/C++)贪心
贪心策略:让总时间花费最小的先问#include <bits/stdc++.h>#define llu unsigned long longusing namespace std;struct node{ int a; int s; int e;};bool cmp(node x,node y){ return (x.a+x.s+x.e) < (y.a+y.s+y.e);}llu t=0,ans=0;int main(){ int n; cin &g..原创 2022-03-26 10:07:08 · 887 阅读 · 0 评论 -
P1115 最大子段和(DP,贪心,暴力)C/C++
P1115 最大子段和思路一:直接暴力,3个测试点超时,40分#include<iostream>#include<cstdio>#include<queue> #include<algorithm>#include<vector>using namespace std;#define ull unsigned long longint main(){ int n,a[200010]; cin >> n ;原创 2021-12-05 11:08:41 · 728 阅读 · 0 评论 -
P1923 【深基9.例4】求第 k 小的数(priority_queue优先队列,nth_element函数,二分排序搜索)C/C++
P1923 【深基9.例4】求第 k 小的数这个题据说能用快速输入卡时间通过,但是我这里不用,仅在此说一下我做此题的思路,有需要了解快速输入的同学可以自行搜索。**优先队列思路:看到这个题,第一感觉是用sort,但是就想试试优先队列,结果只得了60分**#include<iostream>#include<cstdio>#include<queue> #include<vector>using namespace std;#define原创 2021-12-02 10:48:25 · 731 阅读 · 0 评论 -
P1049 [NOIP2001 普及组] 装箱问题(dp)C/C++
P1049 [NOIP2001 普及组] 装箱问题因为每个物体,都有装与不装两种选择,所以我们得到状态转移方程:f[j]=max(f[j],f[j-w[i]]+w[i]);f[j] 为:当总容量为 j 时,不放第 i 件物品,所能装的最大体积。f[j-w[i]]+w[i] 为:当总容量为 j 时,放了第 i 件物品后,所能装的最大体积。(即 j减去第 i 件物品体积 的容量能装的最大体积+第 i 件物品的体积。w[i] 为第 i 件物品体积)#include<iostream>#i原创 2021-12-01 22:13:12 · 1428 阅读 · 1 评论 -
P1164 小A点菜(dp,dfs)C/C++
P1164 小A点菜正解在最下面DFS解法,超时思路:每种菜只有选和不选两种,用dfs暴力一遍,结果超时了#include<bits/stdc++.h>using namespace std;int a[10010],s=0,n,m;void dfs(int step,int money){ if(money==0){ s++; return ; } if(step==n+1)return ;//已经是最后一个菜 if(money>=a[step]原创 2021-12-01 16:05:04 · 811 阅读 · 0 评论 -
P1324 矩形分割(贪心算法)(C/C++)
P1324 矩形分割思路:贪心,优先劈开代价高的,否则就要多付出几次这个大代价。AC代码:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;bool cmp(int x,int y){ return x>y;}int a[2010],b[2010];int main(){ int n,m; cin >> n >&g原创 2021-11-29 18:14:13 · 1140 阅读 · 0 评论 -
洛谷P1111 修复公路(并查集)C/C++
P1111 修复公路输入输出样例输入4 41 2 61 3 41 4 54 2 3输出5说明/提示N≤1000,M≤100000x≤N,y≤N,t≤100000思路:按时间sort一遍,每次合并两个节点,显然如果原先不连通那么合并之后联通块数量–然后如果n==1就输出当前时间return;AC代码:#include<iostream>#include<cstdio>#include<algorithm>using namesp原创 2021-11-29 12:10:34 · 677 阅读 · 0 评论 -
P1017 [NOIP2000 提高组] 进制转换(C/C++)
P1017 [NOIP2000 提高组] 进制转换负进制数转换:和正进制一样,每次取的余数保证在0 – r-1之间。(例如r=-16,则余数应该在0-15)就可以直接输出。所以用系统的“%”运算符的时候必须注意检查是不是在该范围(可能在r+1~0),否则就调整。调整的方法是:如果余数<0,那么:余数-=r;商++;正确性证明:(商+1)×除数+(余数-除数)=商除数+除数+余数-除数=商×除数+余数=被除数了解了上面这些,只需要不断取余最后逆序输出就行啦AC代码:#include原创 2021-11-28 19:45:06 · 772 阅读 · 0 评论 -
P2769 猴子上树(动态规划dp)C/C++
P2769 猴子上树程序循环里主要的部分是枚举树 而不是猴子 !用f[i][j]来表示前 i 只猴子上了前 j 课树#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const long long maxn = 5005 ;long long n,mon[maxn],原创 2021-11-27 22:58:26 · 562 阅读 · 0 评论 -
P1521 求逆序对(动态规划dp)C/C++
思路:当插入第i个数字时,例如插入第4个数字,当插入在最后一个位置,即xxxi那么此时这串数列的逆序对方案数就是前i-1的方案数,因为在末尾,和任何一个数都不构成逆序对,即f[i-][j] ;当插入的位置为xxix时,i和后面的一个数字构成了一个逆序对,那么前面i-1个数字必然要有j-1个逆序对才行,即f[i-1][j-1]接下来便是:f[i-1][j-2],f[i-1][j-3],f[i-1][j-4]…到ixxx,即循环到第i-1次的时候,方案数是f[i-1][j-i-1]可以得到:f..原创 2021-11-25 23:06:52 · 671 阅读 · 0 评论 -
P2242 公路维修问题(贪心算法)C++
P2242 公路维修问题输入:18 43 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43输出:25可以假设每一个坑都被管制了,但是由于管制的路段数量有限,所以就要减去尽可能大的没有坑路段,然后剩下的就是答案了。也就是一个线段分m段,那么有几个缺口呢,m-1个缺口,找出这最大的m-1个缺口,就分成了m段#include<cstdio>#include<algorithm> int n,m;int a[1500原创 2021-07-26 20:44:58 · 935 阅读 · 1 评论 -
P1610 鸿山洞的灯(贪心算法)C++
P1610 鸿山洞的灯第一盏和最后一盏等必须亮着,所以不找。我们使用递推优化。其本质是关灯时把前一盏灯移到当前这一盏灯的位置上,防止下次计算时寻找前一盏灯。有类似链表删除的作用。#include<bits/stdc++.h>using namespace std;int n,dist,a[100002],sum;int main(){ cin>>n>>dist; for(int i=1; i<=n; i++) cin>>a[i];原创 2021-07-26 20:20:44 · 338 阅读 · 0 评论 -
P2212Watering the Fields S(生成树)C++
P2212 [USACO14MAR]Watering the Fields S输入:3 110 25 04 3输出:46Kruskal#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <queue>#i原创 2021-07-21 18:16:20 · 123 阅读 · 0 评论 -
P2330 繁忙的都市(生成树)C++
P2330 [SCOI2005]繁忙的都市输入:4 51 2 31 4 52 4 72 3 63 4 8输出:3 6prim解法:#include<cstdio>#include<cstring>using namespace std;int g[310][310];int n,m,a,b,c,minn[310],mmax=-1;bool u[310];int main(){ scanf("%d%d",&n,&m);原创 2021-07-21 18:02:42 · 407 阅读 · 0 评论 -
P2910Clear And Present Danger S(Floyd算法)C++
P2910 [USACO08OPEN]Clear And Present Danger S题目大致是说有一堆岛,岛之间有海盗,因此每一条边都有一个危险指数(权重),给出一段必须经过的路线,求从一号小岛走到N号小岛最小的危险指数是多少。思路就是用弗洛伊德跑一遍,然后根据必须经过的路线求一下危险指数#include<bits/stdc++.h>//万能头using namespace std;int n,m,ans=0;//计数器int dis[101][101],a[10001];原创 2021-07-21 17:54:33 · 329 阅读 · 0 评论 -
P2888 Cow Hurdles S(floyd算法)C++
P2888 [USACO07NOV]Cow Hurdles S用佛洛依德进行新状态转移时,因为是以k作为中间点,所以牛跨过的最高高度是max(d[i][k],d[k][j]),但是在i->j的整条路径上,跨过的最高高度应该最小,所以最后要取一个MIN,即d[i][j]=min(max(d[i][k],d[k][j]),d[i][j]);输入:5 6 31 2 123 2 81 3 52 5 33 4 42 4 83 41 25 1输出:48-1#include原创 2021-07-21 17:43:11 · 184 阅读 · 0 评论 -
P1339 Heat Wave G(floyd算法)C++
P1339 [USACO09OCT]Heat Wave G输入:7 11 5 42 4 21 4 37 2 23 4 35 7 57 3 36 1 16 3 42 4 35 6 37 2 1输出:7直接floyd算法走起:#include <iostream>#include <cstring>using namespace std;int c,t,ts,te,ti,dis[2501],f[2501][2501],fi,d;bool原创 2021-07-21 17:07:39 · 123 阅读 · 0 评论 -
P3371 【模板】单源最短路径(弱化版)
P3371 【模板】单源最短路径(弱化版)输入样例:4 6 11 2 22 3 22 4 11 3 53 4 31 4 4输出:0 2 4 3#include<iostream>using namespace std;int head[100000],cnt;long long ans[1000000];bool vis[1000000];int m,n,s;struct edge{ int to; int nextt; int wei;}原创 2021-07-19 17:28:19 · 385 阅读 · 0 评论 -
P1141 01迷宫(BFS)C++
P1141 01迷宫输入2 201101 12 2输出44既然一个位置能到达另一个位置,那么反过来一样能达到,因此,可以把一个位置能到达的所有位置看成是一个连通块,在一个连通块内,任何位置所到达的格子一样,这样一来,把连通块的位置都进行标记,再搜索没标记的,再看成一个连通块,直至所有位置搜索完。关键就在vis上面,每次不用清零,直接判断有没有访问过,访问过就不用在访问了。#include<iostream>#include<stdio.h>#incl原创 2021-07-14 16:57:11 · 502 阅读 · 0 评论 -
P1706 全排列问题(DFS+回溯)C++
P1706 全排列问题1-9九个数好比1-9九张扑克牌,数组好比盒子。九个数太多,在这里拿1-3举例开始每个盒子放入对应的扑克,就是1 2 3走到第4个盒子那里发现手里没有扑克了,就往回走拿起3号盒子里面的3,手里也就只有3没有其他的号码,只好这样,继续往回走;走到2号盒子里拿起2,于是手里就有2和3,2已经放过了,就把3放进去,然后往后走,2放入3号盒子,就是1 3 2用vis[]数组记录数字是否用过了#include<iostream>#include<stdio.h&原创 2021-07-14 15:38:24 · 177 阅读 · 0 评论 -
P1219 [USACO1.5]八皇后 Checker Challenge(DFS)C++
P1219 [USACO1.5]八皇后 Checker Challenge对于一条从右上到左下的对角线,其上的棋子坐标应满足x+y为一定值;对于一条从左上到右下的对角线,其上的棋子坐标应满足x-y为一定值,为了避免负数的产生,代码中用x-y+n来储存数字用一个a[][]数组判断该位置是否能放皇后,a[1]代表该列,a[2]代表右上到左下这条对角线,a[3]代表左上到右下这条对角线#include<iostream>#include<stdio.h>#includ原创 2021-07-14 15:25:11 · 185 阅读 · 0 评论 -
P2802 回家(BFS)C++
P2802 回家输入输出样例输入3 32 1 11 1 01 1 3输出4参考的是某个博主的思路#include<iostream>#include<stdio.h>#include<iomanip>#include<stack>#include<queue>#include<cstdlib>#include <algorithm>#include<string.h>#原创 2021-07-14 12:22:41 · 923 阅读 · 0 评论 -
P1443 马的遍历
P1443 马的遍历读入棋盘长宽和马的初始坐标,把马的初始坐标压入队尾设置两个数组,step和vis,step用来记录步数,vis用来标记该坐标是否被访问过,如果不标记的话会死循环然后开始bfs,在队列不为空时,对首元素进行拓展(8个方向,for循环),将拓展的元素压入队尾,首元素出队,重复操作,重复过程直到能访问到的格子都走一遍。剩下的就是不能到达的格子#include<iostream>#include<stdio.h>#include<iomani原创 2021-07-14 09:57:12 · 169 阅读 · 0 评论 -
P1807 最长路(BFS)
P1807 最长路输入输出样例输入2 11 2 1输出1#include<iostream>#include<cstdio>#include<iomanip>#include<stack>#include<queue>#include<cstdlib>#include <algorithm>#include<string.h>#include<math.h>#d原创 2021-07-14 09:26:13 · 529 阅读 · 0 评论 -
买东西(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述小j买东西有个特点,不一定买好的,也不一定要买的多,只要能恰好把身上的钱花光就好。现在给出n个物品的价格Ai以及小j身上的现金S,假设每个物品的数目只有一个,请问他能将身上所带的钱花完吗?输入第一行输入一个数字n表示物品的数目(n ≤ 36),一个数字S表示小j所带的钱( 1≤S≤1e12),用空格隔开。接下来一行n个数字,每两个数字之间用空格隔开,第i个数字Ai表示第i个物品的价格( 1≤Ai≤1e12)。输出若能在n个物品中其恰好购原创 2021-06-11 11:06:35 · 657 阅读 · 2 评论 -
最大团(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述中古时期的战争,是由组织散漫的战斗团,在需要运用策略和调动的战场上互相对峙、冲突,然后再一步一步演进而来。一个国家的交通水平也非常重要,如果把各个城邦看成点,道路看成边,几个城邦之间互有道路相连,那么这些城邦对于整个国家来说,就可以称为一个“完全子图”,完全子图中包含的城邦数量越大,一般说明这个国家的交通水平越高,现在给你一张某国家的地图,你能判断这个国家的交通水平是多少吗?输入第一行输入两个整数N, M(N <= 15, M <原创 2021-06-11 10:45:57 · 1150 阅读 · 2 评论 -
素数环(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述现在有一个环,你需要将1~n填入环的n个顶点内(默认方案的第一个数字为1),使得每相邻的两个数字之和为素数,可能填法不唯一,请你按样例的格式依据字典序输出所有方案。下面是样例中的一种方案。输入多组测试数据,每组一个数字n(1≤n≤15),含义如上。输出按照字典序输出所有方案,详细格式见样例,每组答案之间一个空格。样例输入68样例输出Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8原创 2021-06-11 10:29:33 · 1142 阅读 · 1 评论 -
符文收集(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述在瓦罗兰大陆上,蕴含着强大能量的符文散落在各地。作为召唤师的你需要收集n个符文来强化自身。现在给出你n个符文的坐标,假设起始点在(0,0),请你计算获得这n个符文并回到起始点所需要走的最短路程。(两个点之间的距离为其曼哈顿距离)输入第一行输入一个n,(1≤n≤10 )接下来n行每行两个整数X,Y(-1000≤X,Y≤1000)可能有不同符文的位置相同。输出一个数字表示最短路程。样例输入31 13 32 3样例输出12提原创 2021-06-11 10:04:15 · 259 阅读 · 0 评论 -
m着色(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述魔法宫殿的最深处藏着一把万能权杖,为这个国家提供了强大的军事力量,然而有天却被一个等级略低的小法师误用,导致强大的法术失控,并形成了一个怪异的法阵保护着法杖。国家少了一件圣器,在战火纷飞的年代国力也逐渐衰退,历代国王们不惜一切代价和奖赏,吸引人们来破解法阵,可惜百年来无人能破。现在你穿越来到了宫殿,这个法阵就摆在你面前,它由许多魔法球连接而成,你可以看成一张联通的无向图,由于这个世界的元素是平衡的,相邻的魔法球如果具有相同的元素,就会发出元素之力原创 2021-06-11 09:50:16 · 341 阅读 · 1 评论 -
n皇后(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述在n*n的棋盘摆放n个棋子,任意两个棋子都不能处于同一行、同一列或同一斜线上,问有多少种摆法。输入输入一个整数n(1<=n<=8),表示棋子的个数。输出输出一个整数,表示棋子的摆法数目。样例输入4样例输出2AC代码:#include<bits/stdc++.h>using namespace std;int n,cnt=0,a[20][20];bool used[20];bool judge(i原创 2021-06-10 17:56:47 · 705 阅读 · 0 评论 -
背包问题(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述给定n件物品和一个容量为C的背包,物品i的重量是Wi,价值为Vi。试求如何选择装入背包的物品,使得物品的总价值最大。输入第一行输入一个整数C(0<C<10^9),表示背包容量。第二行输入n(n<=15),表示物品个数第三行输入n个整数,wi表示第i个物品的重量(0<wi<10^9)第四行输入n个整数,vi表示第i个物品的价值(0<vi<10^9)输出输出一行整数,表示背包的最大价值。样例输原创 2021-06-10 17:31:20 · 598 阅读 · 1 评论 -
走迷宫(回溯法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述现在有一个大小为n*m的迷宫,你正在(1,1)点,你想要前往右下方(n,m),并且每次只能向上下左右四个方向走一步,请问有多少种方案。输入第一行输入两个正整数N, M(N <= 10, M <= 10)分别表示迷宫大小,接下来n行每行m个字符字符为’.’或者’#’,’#’代表这个点不能走,请你输出题目描述中的合法的方案数。(一种方案为合法要求其方案中同一个点仅仅被走过一次)输出一个整数为方案数(数据保证方案数小于1e7)样原创 2021-06-10 17:24:33 · 2419 阅读 · 0 评论 -
哈夫曼压缩(贪心算法)C/C++
时间限制: 1 Sec 内存限制: 128 MB题目描述相信大家都对哈夫曼编码有所了解,通常利用哈夫曼编码来压缩数据。现在给你一个字符串,你需要统计其中字符出现的次数然后以出现次数为权值构建一棵哈夫曼树,例如字符串为ABBCCC,其中一种可能的编码是A = 00,B = 01,C = 1,那么这个字符串所对应的哈夫曼编码就是000101111,你的任务是求出字符串最终形成的哈夫曼编码的长度。输入一行由大写字母组成的字符串,且字符串长度不超过10000,该字符串最少包含一种字符。输出字符串的哈夫原创 2021-05-27 08:54:21 · 650 阅读 · 0 评论 -
最大乘积问题(贪心算法)C/C++
时间限制: 2 Sec 内存限制: 128 MB题目描述当Bob睡觉的时候,他想到了一个不可思议的问题,这将是一个非常适合于这次比赛的问题!他决定先用这个问题去试一下他叔叔。经过长时间的思考,Bob的叔叔对如何解决这个问题没有任何想法。但是,他不想告诉Bob他解决不了这个问题,所以他找不到比问你如何解决这个问题更好的方法了。问题如下:给你一个整形数组a=[a1,a2,a3,….,an];对于任意的i,你可以使用魔法把ai变为(-ai-1),求使a1a2a3*…*an最大,输出方案即可。(本题保证方原创 2021-05-27 08:44:50 · 1695 阅读 · 0 评论 -
多机调度问题(贪心算法)C++
问题 F: 多机调度时间限制: 1 Sec 内存限制: 128 MB题目描述有n台规格一样的机器同时工作,有m个零件需要加工,第i个零件加工时间为ti,请你计算出加工完这批零件最少需要多少时间。输入第一行为两个整数n,m。n表示机器数,m表示零件数(1<=n<=1e3,1<=m<=1e5)。接下来一行m个整数为每个零件需要的加工时间(1<=ti<=1e3)。输出加工所有零件需要的最少时间。样例输入3 52 3 4 5 6样例输出7策略:当n原创 2021-05-21 21:31:20 · 2128 阅读 · 1 评论 -
合并石子(果子)(贪心算法)C++
石子合并时间限制: 1 Sec 内存限制: 128 MB题目描述现在有n堆石子,你每次可以挑任意两堆将其合并成一堆,消耗体力是两堆石子的数量和。可知经过n-1次合并后只剩下一堆石子,现在要求消耗总体力最小,请求出合并石子所消耗的最小总体力。输入第一行一个n(0 < n <= 10000),代表有n堆石子,接下来一行n个由空格分隔的数ai(0 <= ai <= 100000)表示第i堆石子的数目。输出输出一行表示答案。样例输入51 2 3 4 5样例输出33原创 2021-05-19 20:43:20 · 1643 阅读 · 0 评论 -
最优装载(贪心算法)C++
题目描述有一个载重量为n的轮船,有m个集装箱的货物需要运送,每个集装箱有一个重量,请计算在忽略体积的情况下轮船一次最多可以运输多少个集装箱?输入第一行为两个整数n,m。分别为轮船载重量和集装箱个数(1<=n<=1e7,1<=m<=1e4)。接下来m行每行有1个整数w(1<=w<=1e3),表示该集装箱的重量。输出输出轮船一次最多可以运送的集装箱数量。样例输入10 43456样例输出2策略:因为忽略体积,所以在没有达到最大装载重量的时候,每一步原创 2021-05-19 19:45:53 · 1998 阅读 · 0 评论 -
田忌赛马(贪心算法)C++
问题描述:你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子;输一局,田忌就要输掉200两银子。已知道国王和田忌的所有马的奔跑速度,请设计一个算法,帮助田忌赢得最多的银子。输入:第一行一个整数n,表示双方各有n匹马;第二行n个整数分别表示田忌的n匹马的速度;第三行n个整数分别表示齐王的n匹马的速度。输出:输出对田忌来说最好的结果贪心策略:1,如果田忌的最快马快于齐原创 2021-05-18 22:25:25 · 6577 阅读 · 0 评论 -
活动安排(贪心算法)C/C++
题目描述有n份兼职,每份兼职有一个开始时间和一个结束时间,假设你的空闲时间为从1到m,假如你的休息时间可以忽略,请你选择若干份兼职(每次只能做其中一个兼职),使你在该段空闲时间内完成的兼职份数最大。输入第一行为两个整数n,m分别表示n份兼职,空闲时间为1到m(1<=n<=1e4,1<=m<=1e5)。接下来n行每行有2个整数a,b。表示该兼职开始和结束时间(1<=a<=b<=m)。输出输出你在1到m时间段内最多能完成几份兼职。样例输入4 101原创 2021-05-17 22:37:38 · 4987 阅读 · 8 评论 -
1223: 最短路(dijkstra算法)
输入第一行两个正整数n,m用空格隔开(n≤100,m≤1000)代表n个顶点,m条边。接下来m行每行三个整数u,v,w代表有一条权值为w的边从u到v,(1≤u,v≤n,1≤w≤100000)可能含有重边。样例解释如上。输出一行n个数,含义如题目描述。样例输入6 101 2 33 4 22 4 71 3 41 4 31 5 102 5 45 6 55 3 22 6 1样例输出 0 3 4 3 7 4#include<bits/stdc++.h>using.原创 2021-05-24 20:24:03 · 367 阅读 · 0 评论