![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
洛谷
洛谷刷题记录
Louis1874
这个作者很懒,什么都没留下…
展开
-
洛谷 P2503 [HAOI2006]均分数据
方法一:模拟退火思路:用DP跑出解,与模拟退火模板结合即可。产生新解需要随机交换数组a中的两个数据,可以随机生成两个不同的下标。#include <bits/stdc++.h>using namespace std;#define re register//加速#define sqr(x) ((x)*(x))//简化代码const double T0 = 2000;//初始温度const double Tk = 1e-6;//终止温度const double delta = 0.原创 2020-07-11 14:23:17 · 184 阅读 · 0 评论 -
洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX
具体题目见洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX方法一:模拟退火思路:当绳子平衡时,系统的能量最小,则此时物体总的重力势能要最小,也就是物体重量一定的情况下绳长最长,即桌子上的绳长最短。使用模拟退火算法,设定适当的系数,产生新解时生成[-t*RAND_MAX,t*RAND_MAX)的随机变动范围(rand():[0,RAND_MAX))#include <bits/stdc++.h>using namespace std;const int maxn = 10..原创 2020-07-11 14:22:44 · 182 阅读 · 0 评论 -
洛谷 P4467 [SCOI2007]k短路
具体题目见洛谷 P4467方法一:A*思路:A* 算法目标状态第一次被取出时即为最优解,根据这个特点,我们只需要取出第 k 个目标状态就是答案。这里使用 SPFA+SLF 反向计算最短路径作为启发函数。...原创 2020-07-11 14:22:24 · 387 阅读 · 0 评论 -
洛谷【模板】单源最短路径
具体题目见洛谷 P3371方法一:Bellman–Ford思路:从i到j点最多经过n-1条边,因此对这n-1条边进行遍历,对于每条边找能更新的,即每次对当前的m条边进行松弛#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e6;int n, m, s;int u[maxn], v[maxn], w[maxn];//u,v,w分别记录一条边的起点、终点和权值ll .原创 2020-07-11 14:24:07 · 354 阅读 · 0 评论 -
洛谷 P1551 亲戚
方法一:并查集思路:将有关系的人放在同一个集合中,询问时若在同一集合则有亲戚关系。关系网是一张图,我们要对结点是否连通进行判断。建立father数组,记录每个结点的父亲。#include<bits/stdc++.h>using namespace std;const int maxn = 1e5;int fa[maxn];int find(int x) {//找父亲 if (x == fa[x]) return x;//父亲是自己 return fa[x] = fi.原创 2020-05-29 09:18:11 · 189 阅读 · 0 评论 -
洛谷 P1506 拯救oibh总部
思路:这道题很明显是一道dfs的题。我们首先从最外圈考虑,若最外圈有原创 2020-01-20 16:40:53 · 233 阅读 · 0 评论 -
Lake Counting
洛谷 P1596 [USACO10OCT]湖计数Lake Counting思路:从任意W开始,不停地将邻接部分用‘.’代替,一次dfs后与初始地w连接地所有W就都替换成了‘.’;直到图中不存在W为止,进行dfs的次数即为所求。代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e2;int N,M;...原创 2020-01-14 18:28:46 · 254 阅读 · 0 评论 -
Ants
思路:首先我们考虑到,两只ants相遇时向反方向爬回,相当于两只ants交错而过继续前进。 由此,时间最短的情况为每只ants向最近端点爬去;时间最长的情况为每只ants向距离最远的端点爬去。代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e6;int x[maxn],n,L,m;int main...原创 2020-01-14 16:16:41 · 258 阅读 · 0 评论 -
洛谷 P1044 栈
思路:符合卡特兰数#include <bits/stdc++.h>using namespace std;const int maxn = 20;typedef long long ll;ll catlan[maxn];void get_catlan(){ catlan[0]=1; for(int i=1;i<=18;i++) for(int j=0;j&...原创 2019-12-16 16:42:09 · 217 阅读 · 0 评论 -
洛谷 P2077 红绿灯
思路:每到路灯前,通过已走路程判断路灯的颜色。遇到红灯时进行再进行运算。#include <bits/stdc++.h>using namespace std;const int maxn = 1e5;int a[maxn],r[maxn],g[maxn];int main() { int n,m;cin>>n>>m; for(int i=0;i...原创 2019-12-08 16:41:55 · 348 阅读 · 0 评论 -
洛谷 P1515 旅行
思路一:每次dfs寻找一个可行方案,记得每次dfs后都要给visited数组置零#include <bits/stdc++.h>using namespace std;const int N=40;int a,b,n,ans;int hotel_distance[N]={0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5...原创 2019-12-01 20:04:24 · 379 阅读 · 0 评论 -
洛谷 P1100 高低位交换
思路:使用掩码运算得到的高16位与低16位取或#include <bits/stdc++.h>using namespace std;int main(){ unsigned n;cin>>n; cout<<((n&0x0000ffff)<<16|(n&0xffff0000)>>16)<<endl...原创 2019-12-01 19:04:21 · 181 阅读 · 0 评论 -
洛谷 P4136 谁能赢呢?
经典博弈论问题:思路1:据题意可知,如果一个人要赢,那么他必须抢到最后一个格子。思路2:想象一下,可以把整个棋盘拆成若干个1*2的格子,后手只是从一个小格子的一侧走到了另一侧;而先手则找到了一个新的格子。因为后手只需走,但先手要找,所以在某个时刻游戏结束时,一定是先手找不到格子了。当n为偶数时,棋盘能被拆分——先手会找不到;当n为奇数时,先手才能赢。#include <bits/s...原创 2019-12-01 17:47:36 · 219 阅读 · 0 评论 -
洛谷 P1488 肥猫的游戏
思路:分类讨论:一、和1个三角形相邻黑色在最外面,直接取走,JMcat赢二、和2个三角形相邻规律如下表:if(n%2)cout<<"PZ Win";else cout<<"JMcat Win";JMcat的必败点就是如上图所示,每次拿走一个三角形实际上就是删去一个点,所以知道剩下5个点JMcat必败,因为一个人取一次,即可得出结论。三、和3个三角形...原创 2019-11-30 16:29:08 · 239 阅读 · 0 评论 -
洛谷 P1996 约瑟夫问题
思路:每个人排队报数,如果报的数是m,出队列,如果不是,重新去队尾排队。#include<bits/stdc++.h>using namespace std;queue<int>q;int main(){ int n,m; cin >> n>>m; for (int i = 1; i <= n; i++)q.push(i);...原创 2019-11-06 19:04:54 · 165 阅读 · 0 评论 -
洛谷 P1165 日志分析
思路:本题实质为栈中搜索最大值的问题。设f[i]为栈中从下到上的i个元素中的最大值,当我们加入一个新元素x时,t++,f[t] = max(f[t-1],x)。那么在出栈时只要输出f[t–]=0,在查找时只要输出f[t]。#include<bits/stdc++.h>using namespace std;const int MAX_N = 201000;typedef l...原创 2019-11-05 20:31:15 · 249 阅读 · 0 评论 -
洛谷 P5594 【XR-4】模拟赛
思路:关于STL中set容器的使用#include<bits/stdc++.h>using namespace std;const int MAXSIZE = 1010;int a[MAXSIZE][MAXSIZE];set<int> b[MAXSIZE];//set容器中每个值都唯一int main(){ int n, m, k; cin >&...原创 2019-10-21 18:45:25 · 323 阅读 · 0 评论 -
洛谷 P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm
思路:深度优先搜索(dfs),递归#include<bits/stdc++.h>using namespace std;typedef long long ll;ll dfs(ll n,ll k) { if ((n + k) % 2 == 1||n<=k)return 1;//不能继续分 else return dfs((n + k) / 2, k)+dfs((n ...原创 2019-10-15 21:49:32 · 460 阅读 · 0 评论 -
洛谷 P2651 添加括号III
思路:a1肯定是分子,a2肯定是分母,只要确认a1a3a4…/a2是否是整数。只要确认a1a3a4…/a2是否是整数。每次将a2=a2/gcd(a2,ai),i=(1,3,4,5…)即可约分#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXSIZE = 10000;i...原创 2019-10-14 20:57:30 · 204 阅读 · 0 评论 -
洛谷 P2525 Uim的情人节礼物·其之壱
思路:利用STL函数#include<bits/stdc++.h>using namespace std;const int MAXSIZE = 10;int main(){ int n; int a[MAXSIZE]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; if (...原创 2019-10-14 15:25:29 · 326 阅读 · 0 评论 -
洛谷 P4702 取石子
思路:首先明确,只要还有石子,那么一定能取不妨设有两堆石子a1,a2,假设现在还有石子且无法取,那么有a1+a2≥0,a2<a1<0①两不等式矛盾:两个负数相加必定不是非负数②石子数不可能为负数所以只要还有石子,就一定能取。问题就转换为两人轮流从一堆石子取一粒,谁先不能取谁输。#include<bits/stdc++.h>using namespace std...原创 2019-10-14 15:03:14 · 375 阅读 · 0 评论 -
洛谷 P1590 失踪的7
思路:起初的思路是遍历1到n,判断每个数字是否出现7。后几组数据过大超时。优化思路:把每一位不含7的方案数算出来,因为每一位是相互独立的,所以这些方案数加起来就是答案#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ int t; cin >> t; ll ...原创 2019-10-14 12:09:44 · 237 阅读 · 0 评论 -
洛谷 P1568 赛跑
思路:将输入的speed和time转换为两人每个时刻的位移数组,然后比较两人位移数组大小变换的次数。如果先将输入转换成每时刻速度再转换为位移,会有数据错误。可以直接在输入时就计算两人的位移数组。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXSIZE = 1000100;...原创 2019-10-14 11:24:26 · 351 阅读 · 0 评论 -
洛谷 P2241 统计方形(数据加强版)
思路:假设n<m,边长为n的正方形个数为:i(n-m+i)*总的正方形数为:sigma [i(n-m+i)] (i=1,2……min{n,m})*矩形个数为:n行有n+1条横边,m列有m+1条竖边,从横边和竖边中各选两条构成矩形,组合数Cn+1,2*Cm+1,2。长方形数=矩形数-正方形数#include<bits/stdc++.h>using namespace ...原创 2019-10-13 20:14:13 · 370 阅读 · 0 评论 -
洛谷 P2637 第一次,第二次,成交!
思路:要找到转到最多钱最低的单批草料售价先对p从小到大排序。如果有人出价相同,需要特判。**要保证草料够卖。**遍历p,找出赚到最多的钱。#include<bits/stdc++.h>using namespace std;const int MAXNUM = 1000;int main(){ int n, m; cin >> n >> m; ...原创 2019-10-13 19:27:40 · 540 阅读 · 0 评论 -
洛谷 P2393 yyy loves Maths II
思路:直接进行sum+=data时,浮点数的精度会发生变化。应将其转换为整数后再相加#include<bits/stdc++.h>using namespace std;int main(){ long double a,sum=0; while (cin >> a) sum += a*1000000;//去除小数部分,提高运算精度 cout <...原创 2019-10-13 18:35:43 · 174 阅读 · 0 评论 -
洛谷 P1149 火柴棒等式
思路:将数字转换为火柴棒个数,两层循环遍历a和b,如果符合func(a)+func(b)+func(a+b)==n则记录一次#include<bits/stdc++.h>using namespace std;const int MAXNUM = 1000;int func(int n) {//将数字转换为火柴棒个数 int x[10] = { 6,2,5,5,4,5,6,...原创 2019-10-13 16:13:37 · 137 阅读 · 0 评论 -
洛谷 P1847 轰炸II
思路:本题数据过大,不能用二维数组直接模拟。如果用稀疏矩阵,矩阵赋值开销过大。应将第一部分的数据暂时存到数组中,在第二部分遍历判断关键点是否在轰炸区内。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXSIZE = 3000;int main(){ int m, n;...原创 2019-10-13 15:39:34 · 279 阅读 · 0 评论 -
洛谷 P2394 yyy loves Chemistry I
cin无法读取,用scanf强制提高精度#include<bits/stdc++.h>int main(){ long double x; scanf("%15Lf", &x);//强制提高精度 printf("%.8Lf", x/23);//输出保留8为小数 return 0;}...原创 2019-09-30 20:25:05 · 207 阅读 · 0 评论 -
洛谷 P1022 计算器的改良
思路:先根据字母位置找到字母前的系数,将所有运算过的数字和符号进行标记。再根据符号位置计算等号左右常数。输入#247-2=6y+3输出#27.000输入#3a+2a=4输出#31.333代码:...原创 2019-08-19 18:24:41 · 135 阅读 · 0 评论 -
洛谷 P2708 硬币翻转
思路:遍历字符串,统计全是0的区间的个数,乘2即为结果。注意:当输入全为0时需要加特判;s[0]为0时,结果需要-1#include<bits/stdc++.h>using namespace std;typedef long long ll;int judge(char* s)//判断输入是否全为0{ int len = strlen(s); for (int i ...原创 2019-08-14 17:09:28 · 273 阅读 · 0 评论 -
洛谷 P2043 质因子分解
思路:N!=1x2x…xN,因此可通过每个乘数找其质因子原创 2019-08-11 14:22:53 · 337 阅读 · 0 评论 -
洛谷 P1548 棋盘问题
找规律:正方形:边长为1的正方形个数为nm边长为2的正方形个数为(n-1)(m-1)边长为3的正方形为个数(n-2)(m-2)边长为min(n,m)的正方形为个数s1=(n-min(n,m)+1)(m-min(n,m)+1)然后从边长为1到min(m,n)的正方形个数全部加起来;长方形:(包括正方形)长为1的长方形(包括正方形)有n个长为2的长方形(包括正方形)有n-1个长...原创 2019-08-10 14:38:02 · 209 阅读 · 0 评论 -
洛谷 P1897 电梯里的爱情
代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a[1000010];int main(){ ll n, i; cin >> n; for (i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); ll...原创 2019-08-09 16:57:49 · 413 阅读 · 0 评论 -
洛谷 P2415 集合求和
思路:集合中所有元素之和为每个元素之和乘2^(元素个数-1)#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ int a[30]; int i=0; while (cin >> a[i++]);//合写cin>>a[i];i++;输入数据个数不...原创 2019-08-08 11:39:09 · 472 阅读 · 0 评论 -
洛谷 P1320 压缩技术(续集版)
思路:while循环中逐行处理,记录每行最后一个元素,与次行第一个元素比较。注意:压缩码第二位为0的个数。输入样例#1:0001000000100000011110001000000100000010001111111输出样例#1: 1 6 1 6 4 3 1 6 1 6 1 3 7输入样例#2:1111100100111110010011111输出样例#2:5...原创 2019-08-04 14:24:16 · 1333 阅读 · 0 评论 -
洛谷 P1321 单词覆盖还原
输入#1…boyogirlyy…girl…输出#142思路:遍历数组,找到b后遍历其后两个元素是否为oy,如果是则i++#include<bits/stdc++.h>using namespace std;int main(){ string s;cin >> s; int len = s.length(),num1=0,num2=0; int i...原创 2019-08-03 15:36:25 · 721 阅读 · 0 评论 -
洛谷 P1075 质因数分解
解法:从小到大找n的因子,再判断是否为素数,如果是,输出另一个较大的因子。注意:不能从大到小遍历数组找因子,这样会TLE。#include<bits/stdc++.h>using namespace std;typedef long long ll;int isPrime(ll n){ ll i; for (i = 2; i <= sqrt(n); i++) {...原创 2019-06-22 18:50:46 · 480 阅读 · 0 评论 -
洛谷 P2788 数学1(math1)- 加减算式
解法一:读取一个字符串。首先特判第一个数字的正负;设变量start,end,记录数字的左右下标方便转换数字;循环每移动到一个符号停止,计算该符号之前的数字。最后一个数字之后无符号,需特判。注意:该数字的符号在该数字之前。#include<bits/stdc++.h>using namespace std;typedef long long ll;string s;int ...原创 2019-06-22 17:54:12 · 436 阅读 · 0 评论 -
洛谷 P1789 【Mc生存】插火把
解题思路:思路十分简单,创建一个二维数组置零存地图,将有火把和萤石的地方置1,循环遍历数组,将值为0的计数。注意:数组在边界有可能会越界,加两行两列的边框即可。#include<bits/stdc++.h>using namespace std;int a[10000][10000];int main(){ int n, m, k, i, j,x,y,o,p; cin ...原创 2019-06-22 15:50:50 · 1008 阅读 · 0 评论