ACM
山东章鱼哥
这个作者很懒,什么都没留下…
展开
-
E - Find The Multiple
本题要求输出一个仅有0,1组成的数能过整除n,任意输出一个就行了,利用dfs来做,遍历到19位就行啦(其实我是百度的)#include<iostream>#include<cstdio>typedef long long ll;int n,flag;void dfs(int x,ll y){ if(x==19||flag) return; if(y%n==0)...原创 2018-02-08 16:29:15 · 100 阅读 · 0 评论 -
J - Fire!
用先让火走的原则,再让人走,运用一个广搜即可,最后步骤不要忘了加一#include<cstdio>#include<queue>#include<cstring>using namespace std;const int INF=10000000;const int maxn=1000+100;int n,m;char str[maxn][maxn...原创 2018-02-12 14:50:13 · 515 阅读 · 0 评论 -
K - 迷宫问题
本题是广搜加深搜的题,注意要从0,0开始#include<cstdio>#include<queue>using namespace std;const int N=5;const int maxn=10;int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int g[N][N];struct node{ int x,y;}f...原创 2018-02-12 13:24:57 · 128 阅读 · 0 评论 -
H - Parity game
本题关键在父节点的初始化上,应该初始化为-1,这样才能方便判断#include#include#include#includeusing namespace std;const int maxn=10000+100;int par[maxn],val[maxn];int n,m,cnt;bool flag;map mp;int Insert(int x){ if(!mp原创 2018-02-06 17:42:47 · 269 阅读 · 0 评论 -
N - Is It A Tree?
本题跟M题很像,但比它简单,只要当0,0时判断就行了,之后再初始化#include#include#includeusing namespace std;const int maxn=100010;int par[maxn],p[maxn],t[maxn];int cnt,temp;bool flag; int find(int x){ //cout<<"here"<<end原创 2018-02-06 16:06:48 · 142 阅读 · 0 评论 -
M - 小希的迷宫
本题关键一点在输入上,再之后就是再判断根节点是否有两个上,一般的条件是,如果两个父节点重复的话,则不满足情况,并且,在par数组上要初始化为0,对应的find函数也要改变#include#include#includeusing namespace std;const int maxn=100010;int par[maxn],p[maxn],t[maxn];int cnt,t原创 2018-02-06 14:52:59 · 130 阅读 · 0 评论 -
M - 昂贵的聘礼
本题用dij来做,那个等级的约束注意一下就行了#include#include#include#includeusing namespace std;const int maxn=100+10;const int INF=1e8;int v[maxn][maxn],dis[maxn],vis[maxn];struct node{ int price,level,alter;原创 2018-01-29 22:05:10 · 211 阅读 · 0 评论 -
L - Connections in Galaxy War
本题题意为给定逐个点的力量值,再给出通道数,和询问数,要求给出询问点的来救援的点,本题我是百度出来的,下面写法也一致,本题是反过来输出结果,利用栈来实现#include#include#include#includeusing namespace std;const int maxn=20000+1000;const int Big=10000;int h[maxn],power原创 2018-02-05 20:37:42 · 205 阅读 · 0 评论 -
K - Candies
本题要求1~n之间相隔最大值,而题目给出的权值即为最大值,所以转化为最短路问题;照例试了四种算法,只有spfa奏效,bellman_ford超时,其余两种实现不了spfa:#include#include#include #include#includeusing namespace std;typedef long long ll;const int maxn=1e6+10原创 2018-01-29 14:25:43 · 357 阅读 · 0 评论 -
I - Fire Game
同样是利用广搜来做,唯一不同是有了两个起点,并且还是遍历起点来进行判断,比较哪一种搭配最适合或走的步数最少,btw,如果出现runtime error情况,一般是数组或者结构体数组开小了#include<queue>#include<iostream>#include<cstdio>#include<cstring>using namespa...原创 2018-02-13 00:36:46 · 237 阅读 · 0 评论 -
L - Oil Deposits
本题运用深搜可做,应该广搜也可以,我写了一下,wa,不过深搜简单多了,注意再8种情况遍历的地方,要使用x+d[i][0]代入,x+=d[i][0],出错#include<cstdio>#include<queue>#include<iostream>#include<cstring>using namespace std;const int...原创 2018-02-13 12:39:15 · 160 阅读 · 0 评论 -
A - 棋盘问题
本题是dfs搜索训练,1.在输入数据时事先进行标记,哪些存在棋盘,2.在dfs中注意回溯就行了#include#include#includeusing namespace std;const int maxn=10;int vis[maxn],a[maxn][maxn];int k,n,m,cnt;void dfs(int x,int k){ if(k==m) { c原创 2018-02-07 15:38:04 · 133 阅读 · 0 评论 -
B - Networking
在A题的基础上,改变一下io,基本算法保持不变#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=50+5; struct node{ int v; int len; node(int...原创 2018-02-17 20:10:11 · 155 阅读 · 0 评论 -
A - Jungle Roads
本题是一个裸的最小生成树,直接使用prime算法来进行计算,利用vector来进行容器计算即可#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=30; struct node{ int ...原创 2018-02-17 19:26:03 · 170 阅读 · 0 评论 -
D - Fliptile
本题是二进制枚举,加上dfs来的,至于情况的区分上跟上题有异曲同工之妙,#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn=20;const int INF=100000000;int ...原创 2018-02-08 15:33:51 · 234 阅读 · 1 评论 -
F - Prime Path
本题首先判断1000-9999哪些为素数,再读入数据进行判断#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<cmath>using namespace std;const int maxn=10000;int v[maxn]...原创 2018-02-15 15:21:40 · 304 阅读 · 0 评论 -
M - 非常可乐
本题是广搜的题,一共有6种倒法;#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=100+10;int v[maxn][maxn][maxn];int d[6][2]={{0,1},{0...原创 2018-02-14 19:58:10 · 129 阅读 · 0 评论 -
N - Find a way
运用bfs来做,并且运用一个三维数组来区分两个人分别走过的踪迹#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=200+20;const...原创 2018-02-14 15:10:34 · 194 阅读 · 0 评论 -
C - Catch That Cow
本题是bfs的应用,将所有的满足情况置入队列之中,然后再判断是否到达终点(满足条件)就行,注意本题不能使用stack来储存,只能使用queue#include#include#include#include#includeusing namespace std;int n,k,cnt;const int maxn=200000+100;int vis[maxn];struct原创 2018-02-07 19:49:04 · 158 阅读 · 0 评论 -
B - Dungeon Master
本题就是三维的dfs,第一次接触有点不熟练,之后就慢慢好了,另外注意在dfs中那些变量和结构体尽量声明新的,防止出错;还有一点就是,记住有6种情况要依次遍历#include#include#include#includeusing namespace std;const int maxn=50;char a[maxn][maxn][maxn];int vis[maxn][maxn原创 2018-02-07 17:20:22 · 171 阅读 · 0 评论 -
关于最短路的几种算法的模板总结
最近在做kuangbin的最短路专题,把常用的一些算法模板贴一下 至于spfa和bellman_ford,floyd可以去I题找一下,但是floyd有多种应用方法,就没有详细叙述了,反正也是给自己看的 dij:“` void dij(int x) { for(int i=1;i<=n;i++) dis[i]=v[x][i]; dis[x]=0;vis[x原创 2018-01-28 22:42:42 · 136 阅读 · 0 评论 -
J - Invitation Cards
本题的题意是要求出从起点到各个点的所有最小权值和,并且要反过来再求一遍,本题用spfa来做,本来想用bellman_ford来做的,但试了一下超时了,故给出spfa,但我还是在后面贴出超时的代码,也许哪位大佬可以帮我看看;另外感觉自己写代码越来越模式化了。。做后面的题目我觉得关键是读懂题意和如何建图的问题了; spfa:#include#include#include #inclu原创 2018-01-28 22:33:26 · 324 阅读 · 0 评论 -
D - How Many Answers Are Wrong
本题关键是记录每个顶点代表的值,然后又要记录最左端记录的值,并且本题的输入部分要用EOF来,输入有多组连续的数据#include#include#includeusing namespace std;const int maxn=400000+2000;int par[maxn],val[maxn];int n,ans;int find(int x){ int k=par[x原创 2018-02-02 14:10:00 · 412 阅读 · 0 评论 -
A - Til the Cows Come Home
本题为经典的dij算法,刚开始想的时候,想偷懒用floyd来做,发现超时,只有使用dij来做,另外注意有重复边现象,每次都选最小的边来做,有贪心的思维,并且注意这是一个无向图; 下面见ac代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int原创 2018-01-26 14:02:20 · 170 阅读 · 0 评论 -
B - The Suspects
本题刚开始做的时候,超时了一次,然后发现读入数组时用了二维数组来做,其余的跟A题没有去区别下面见ac代码#include#include#include#includeusing namespace std;const int maxn=30000+10;const int maxm=500+10;int par[maxn],num[maxn];map all;int stu原创 2018-02-01 16:04:40 · 141 阅读 · 0 评论 -
A - Wireless Network
本题运用并查集来进行解决,刚刚学习并查集,在union处出错了,还要进行注意;下面见ac代码#include#include#include #includeusing namespace std;const int maxn=3000+10;int x[maxn],y[maxn],par[maxn];int repair[maxn]={0};int n,len;doub原创 2018-02-01 14:16:30 · 165 阅读 · 0 评论 -
O - Extended Traffic
本题运用spfa来做,我用了vector优化,和数组来优化的两种方式,没有用bellman_ford来做了,另外注意结构体和vector的定义要用大的那个数组来spfa,vector优化型:#include#include#include#include#include using namespace std;const int maxn = 100005;const i原创 2018-01-31 15:54:27 · 202 阅读 · 0 评论 -
有趣的赛车比赛 uva 12661
最短路的问题,注意在读入数据时去掉开放时间小于通过时间的边 以下ac代码#include<bits/stdc++.h>using namespace std;int n,m,s,t;const int maxn=30000+10;const int INF=100000000;typedef long long ll;struct edge{ ll u,v,a,b,t;};原创 2018-01-16 14:04:08 · 186 阅读 · 0 评论 -
L - Subway
本题最烦是建图的过程,忘记了初始化sum,总是error,后面终于找到了#include#include#include#include#include#includeusing namespace std;const int maxn=30000+10;const int N=200+50;const double INF=1000000000.0;int vis[m原创 2018-01-29 17:21:45 · 241 阅读 · 0 评论 -
N - Tram
本题使用可以使用dij,floyd,spfa来做,据说可以用bellman来做,但我写的是wa,但过了样例:先放dij:#include#include#includeusing namespace std; const int maxn=100+10;const int INF=1e7;int vis[maxn],dis[maxn];int v[maxn][maxn];s原创 2018-01-30 21:42:06 · 196 阅读 · 0 评论 -
Frogger
本题还依旧是dij算法来做,但再进行松弛操作时,有一点变化,计算最小最大路,dis[j]=min(dis[j],max(dis[u],g[u][j]); 下面见ac代码#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const原创 2018-01-26 15:13:01 · 120 阅读 · 0 评论 -
Heavy Transportation
本题跟frogger那题很像,不同是,一个是取最小的,一个是最大的,同时注意输出的换行的问题 见ac代码,#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000+10;const int INF=100000000;int原创 2018-01-26 16:26:04 · 155 阅读 · 0 评论 -
E - 食物链
关于本题和上题一样,运用一定的数学知识,这题我是百度才出来的,关于公式如何推出的还有点一知半解,初学还有很多要学啊#include#includeusing namespace std;const int maxn=50000+50;int par[maxn],r[maxn];int n,ans;int find(int x){ int k=par[x]; if(k!=x)原创 2018-02-02 16:25:07 · 245 阅读 · 0 评论 -
I - Arbitrage
本题是典型的判断正圈的问题,很直接就想到用spfa,和bellman_ford来做,但是没想到可以用floyd来做,比较三种做法,spfa最快,bellman_ford最慢;但也只比floyd慢10多毫秒左右,如果用scanf的话还要更快,下面给出三种解法 spfa:#include<cstdio>#include<queue>#include<stack> #include<cstring原创 2018-01-28 20:54:02 · 242 阅读 · 0 评论 -
H - Cow Contest
本题有floyd传递闭包的题,然后判断总数是否等于n-1就行了 floyd:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=100+10;int n,m1;int m[maxn][maxn];void floyd(){ for(int k=1;k<=n原创 2018-01-28 17:43:59 · 144 阅读 · 0 评论 -
G - MPI Maelstrom
运用bellman_ford,和spfa来解决这个问题 bellman_ford:#include<iostream>#include<cstring>#include<cstdio>#include<stack>#include<algorithm>using namespace std;const int maxn=5000+10;const int INF=1e6;struc原创 2018-01-28 16:56:40 · 197 阅读 · 0 评论 -
Wormholes
本题依旧跟上题一样,可以运用bellman_ford和spfa来做,但是跟上题不同的是,本题是判断负圈,所以在初始化dis时应该初始化为INF,然后在判断时也要用大于号来进行判断,另外关于spfa有另一种方法,使用head来存上一个节点的序号,但上一题的做法莫名wa,以后就用存头节点的方法来做 bellman_ford:#include<cstdio>#include<queue>#inclu原创 2018-01-28 00:01:42 · 145 阅读 · 0 评论 -
J - A Bug's Life
本题跟是一个分类的并查集,我看了百度才出来的,关键是有一个数组来区分这个数据究竟属于哪一类#include#includeusing namespace std;const int maxn=2000+100;int val[maxn],par[maxn];int flag,n;int find(int x)//通过find来寻找父节点同时寻找性别关系 { int k=par[原创 2018-02-03 15:51:38 · 187 阅读 · 0 评论 -
E - Currency Exchange
本题是最短路判断图中是否存在正环的题,可用bellman_ford和spfa来做,记得再第一种做法的结构体的定义中要开大于>100的数,不然会runtime error,关于spfa,利用vector来实现保存,并且用stack来存会比queue快一些,详情见代码 bellman_ford:#include<cstdio>#include<cstring>#include<iostream>原创 2018-01-27 14:58:28 · 190 阅读 · 0 评论 -
G - Supermarket
本题题意是很好理解的,输出最大的利润,但是我怎么都想不到运用并查集来做,后来百度,看了“无忧望月”的博客,才知道的,下面的代码也是看了他的才写出来的,ps,记得在操作之前初始化#include#include#include using namespace std;const int maxn=10000+100;int par[maxn];struct node{ int pi原创 2018-02-03 12:43:39 · 155 阅读 · 0 评论