![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ZOJ
文章平均质量分 57
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
ZOJ 1038 - T9
用的是map,把相同前缀的词的概率加到一个map里面,找出里面的概率最大的,然后在相同的最大概率中找出字典序最小的.#include #include #include #include #include #include using namespace std;const int b[10][4]={{0},{0},{'a','b','c'},{'d','e','f'},{原创 2013-01-18 10:11:35 · 546 阅读 · 0 评论 -
ZOJ 3674 - Search in the Wiki
找各个单词之间的公共tips,用一个数组cnt来计数,cnt[i]值为要查询的单词的数量就是一个common word,最后对答案拍下序#include #include #include #include #include #include #include using namespace std;#define MAX 1000char buf[2048];map原创 2013-03-30 21:55:28 · 695 阅读 · 0 评论 -
ZOJ 2109 FatMouse' Trade
简单的贪心,按照J[i]和F[i]的比列从大到小排序,然后计算和,注意M和F[i]为0的情况#include #include #include #include #define INF 1000000000using namespace std;const int maxn=1010;struct node{ int f,j; double ratio; node(i原创 2013-04-03 15:30:25 · 462 阅读 · 0 评论 -
ZOJ 1797 Least Common Multiple
求多个数的最小公倍数:求出前两个数的最小公倍数,然后用这个最小公倍数和第三个数求最小公倍数,迭代下去.lcm(a,b)=a*b/gcd(a,b),先除再乘,否则会溢出#include #include using namespace std;int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b);}int lcm(i原创 2013-04-02 20:49:15 · 465 阅读 · 0 评论 -
ZOJ 1025 Wooden Sticks
贪心,按照长度从小到大排序,然后从i开始往后扫描,长度比当前len并且重量比当前wei小的都归到同一段去;自己还是太水#include #include #include #include using namespace std;const int maxn=5010;bool vis[maxn];struct wood{ int l,w; wood(int ll=0,原创 2013-04-04 09:11:09 · 489 阅读 · 0 评论 -
ZOJ 2110 Tempter of the Bone
一道很好的DFS题目#include #include #include #include #include using namespace std;const int maxn=7;bool vis[maxn][maxn];char maze[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,t,ti,tj;boo原创 2013-04-03 20:37:12 · 356 阅读 · 0 评论 -
ZOJ 2787 Children of the Candy Corn
普通的广搜,靠左和靠右的下一行和下一列增量要想清楚#include #include #include using namespace std;struct state{ int ci,cj,ctime,cDir; state(int i=0,int j=0,int ct=0,int cd=0):ci(i),cj(j),ctime(ct),cDir(cd){}};const原创 2013-04-05 11:06:30 · 458 阅读 · 0 评论 -
ZOJ 2008 Invitation Cards(邻接表+spfa||dijkstra)
这题收获很大,求1到所有点的最短距离,然后再求所有点到1的最短距离,把所有的边反一下在求1到所有点的最短距离就是所有点到1的最短距离了.刚开始用new直接就TLE了还以为是最短路算法问题,试了dijkstra还有spfa都是TLE,后来看了解题报告才发现必须要用静态邻接表才能过,最后运行时间:dijkstra 290ms,spfa 280ms.还是spfa稍好一点,并且易于实现#i原创 2013-04-07 09:57:54 · 617 阅读 · 0 评论 -
ZOJ 2750 Idiomatic Phrases Game(邻接表+dijkstra)
把每个idiom看成两个节点,中间连一条边只为该idiom的值,两个能连边的idiom连边,权值设为0,然后各种最短路算法就可以了.这里判断尾部是否等于头部时候,用枚举的话会超时,最好用map来记录相同头部#include #include #include #include #include #include #include using namespace s原创 2013-04-07 11:17:51 · 544 阅读 · 0 评论 -
UVA ZOJ 3490 - String Successor
#include #include #include #include using namespace std;void carry(string &str,int i){ if(str[i]=='Z'+1||str[i]=='z'+1||str[i]=='9'+1){//是否产生进位 char ch; if(str[i]=='Z'+1)ch='A',str[i]='A';原创 2013-03-23 21:50:30 · 540 阅读 · 0 评论 -
ZOJ 2416 Open the Lock (BFS)
#include #include #include #include using namespace std;#define pii pair int delta[]={-1,1};bool vis[10000];int bfs(int s,int t){ memset(vis,0,sizeof(vis)); queue q; q.push(make_pair(s,0));原创 2013-04-13 14:39:38 · 569 阅读 · 0 评论 -
ZOJ 2482 IP Address
二进制转十进制#include #include #include #include using namespace std;char buf[50];int binToDec(string str){ int ret=0,stride=1; for (int i=str.size()-1;i>=0;stride*=2,--i){ ret+=stride*(str[i]-'原创 2013-04-13 14:48:21 · 440 阅读 · 0 评论 -
ZOJ 2256 Mincost
n表示长度nn>8:n%8==0每8个距离重设metern%8n%8#include #include using namespace std;int main(){ int n; while (scanf("%d",&n)&&n){ double ans=0; if(n<=8){ n-=4; ans=10; if(n>0){原创 2013-04-13 20:57:41 · 941 阅读 · 0 评论 -
ZOJ 1577 GCD & LCM
公式lcm(q,p)=q*p/gcd(q,p)得x*y=q*p#include #include #include #include using namespace std;int x,y;int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b);}int main(){ while(scanf("%d%d"原创 2013-04-12 22:45:10 · 398 阅读 · 0 评论 -
ZOJ 1276 Optimal Array Multiplication Sequence(矩阵链乘法)
转移方程:m[i,j]= 0 if i==j, min(m[i][k]+m[k+1][j]+p[i-1]p[k]p[j]) if i#include #include #include #include using namespace std;#define INF INT_MAXconst int maxn=15;int s[maxn][maxn],m[maxn]原创 2013-04-22 13:05:36 · 627 阅读 · 0 评论 -
ZOJ 1073 Round and Round We Go(高精度乘法)
#include #include #include #include #include using namespace std;const int maxn=80;int len=0;char str[maxn];string mul(string s,int n){ int carry=0; for (int i=s.size()-1;i>=0;--i){ int原创 2013-04-12 16:11:14 · 672 阅读 · 0 评论 -
ZOJ 1909 Square(DFS+剪枝)
开始对边排一下序,搜索的时候完整的拼成了一条边的话从0开始搜索下一条完整的边.否则因为前面的木棍要么已经被选择了,要么是长度比当前完整边剩下的要长,根本没有必要再从0开始所以可以从当前的小木棍的下一个条小木棍开始搜索完成当前这条边,.不加这个剪枝怎么都过不了,20太大了.#include #include #include #include #include原创 2013-04-14 17:55:47 · 489 阅读 · 0 评论 -
ZOJ 1937 Addition Chains(DFS)
#include #include #include using namespace std;vectorstak,ans;int n;void dfs(){ if(stak[stak.size()-1]==n){ if(stak.size()<ans.size()){ ans=stak; } return; }else if(stak.size()>=ans.s原创 2013-04-14 19:55:58 · 817 阅读 · 0 评论 -
ZOJ 2192 T-Shirt Gumbo(DFS)
普通的搜索会超时可以剪的地方:1.库存里没有T-shirt了可以剪掉2.刚开始对各个参赛者的大小要求范围按最小的排个序,再进行搜索#include #include #include #include #include using namespace std;const int maxn=50;char buf[maxn],tb[90];string dem[30]原创 2013-04-14 15:38:43 · 439 阅读 · 0 评论 -
ZOJ 1246 Instant Complexity(栈应用)
计算程序时间复杂度的有可能出现 loop 0的情况所以给每一个块带一个coe系数,块中如果内嵌块,则把外面的块的coe系数传递过去.#include #include #include #include #include using namespace std;#define pb push_backconst int maxn=11;bool poly[maxn];原创 2013-04-23 10:09:15 · 575 阅读 · 0 评论 -
ZOJ 2081 Mission Impossible(BFS+DFS)
首先BFS找最短距离然后DFS搜索每一条最短路径,统计成功和失败的路径数目#include #include #include #include #include using namespace std;const int maxn=15;char maze[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m,minDis原创 2013-04-14 10:04:52 · 600 阅读 · 0 评论 -
ZOJ 1694 Shredding Company(简单DFS)
#include #include #include #include #include using namespace std;vectorv,stak;vector >ans;int tar,start,minv,ansSum;void dfs(int curi,int sum){ if(sum<=tar&&curi==v.size()){ if(tar-sum<mi原创 2013-04-14 10:59:37 · 1587 阅读 · 0 评论 -
ZOJ 2292 Anti-bug before Chinese Valentine's Day(DFS+剪枝)
剪枝:1.当前用的杀虫剂的个数超过了当前最优值,剪掉2.当前的点上有虫子,必须要放杀虫剂,因为杀虫剂的范围是lawn[i][j],law[i][j+1],law[i+1][j],law[i+1][j+1],如果不放的话,后面就没有机会杀掉这个位置上的虫子了,想想就明白了3.如果当前位置放了杀虫剂,那么可以直接跳到ci,cj+2位置,因为杀虫剂的范围内已经没有虫子了,没有必要.4.如原创 2013-04-23 16:01:38 · 574 阅读 · 0 评论 -
ZOJ 1179 Finding Rectangles(DFS+剪枝)
首先开始对各个点的x坐标从小到大排序,然后每次搜索的时候只从下一个点开始对于每个点必须和栈中的某个点x坐标或者y坐标相等,不然没有必要搜.最后对结果排个序#include #include #include #include #include #include #include using namespace std;const int maxn=30;struct原创 2013-04-15 08:22:44 · 491 阅读 · 0 评论 -
ZOJ 2165 Red and Black (floodfill)
#include #include #include using namespace std;const int maxn=25;int di[]={-1,1,0,0},dj[]={0,0,-1,1},ans,n,m;char g[maxn][maxn];void flodfill(int ci,int cj){ g[ci][cj]='#'; ans++; for (int i原创 2013-04-15 19:24:16 · 649 阅读 · 0 评论 -
ZOJ 2922 Bombs(记忆化搜索)
从右下角左上扫描就可以了,其实不加记忆化搜索也是可以过的,记忆化搜索还不怎么会.dp1表示左边的下一个位置,dp2表示上面的位置下一个位置#include #include #include using namespace std;const int maxn=1010;int rm[maxn][maxn],dp1[maxn][maxn],dp2[maxn][maxn],n,原创 2013-04-23 17:49:44 · 628 阅读 · 0 评论 -
ZOJ 1107 FatMouse and Cheese(记忆化搜索)
用dp[i][j]数组存已经计算好的从i,j出发能得到的最大值,每次再求的时候可以直接返回去,避免重复计算.#include #include #include #include using namespace std;const int maxn=102;int dp[maxn][maxn],v[maxn][maxn],di[]={-1,1,0,0},dj[]={0,0原创 2013-04-23 20:41:17 · 471 阅读 · 0 评论 -
ZOJ 1589 Professor John(传递闭包)
#include #include #include using namespace std;const int maxn=30;int m;bool g[maxn][maxn],vis[maxn][maxn];int main(){ int t,cas=1; scanf("%d",&t); while (t--){ scanf("%d\n",&m); memset(g原创 2013-04-15 20:10:10 · 541 阅读 · 0 评论 -
ZOJ 1119 SPF(tarjan求割点)
关于割点的内容参考这篇文章:http://www.byvoid.com/en/blog/biconnect//* 1、若深度优先生成树的根有两棵或两棵以上的子树,则此根顶点必定为关节点。*/ /* 2、若生成树中某个非叶子顶点v,其孩子结点均没有指向 v 的祖先的回边,则 v 为关节点。*/ #include #include #include #include原创 2013-04-16 09:40:52 · 512 阅读 · 0 评论 -
ZOJ 1542 Network(裸MST)
sample好像有点问题#include #include #include #include using namespace std;const int pmaxn=1010,emaxn=15010;struct edge{ int u,v,w; bool operator<(const edge&rhs)const{ return w<rhs.w; }}es[em原创 2013-04-16 15:17:45 · 559 阅读 · 0 评论 -
ZOJ 2058 The Archaeologist's Trouble II
对于最大的尽量每一个都放@并且保证每一行都是@*交错的对于最小的尽量每一个都放*并且保证每一行都是@*交错的#include #include #include using namespace std;const int maxn=110;char tri[maxn][maxn],ttri[maxn][maxn];int n;int main(){ while (scanf("原创 2013-04-16 19:16:48 · 671 阅读 · 0 评论 -
ZOJ 1311 Network(tarjan求割点)
#include #include #include #include #include using namespace std;const int maxn=100;struct edge{ int v,next;}es[maxn*5];int dfn[maxn],low[maxn],head[maxn],idx,i,n,ans;char buf[maxn];void i原创 2013-04-16 12:39:52 · 564 阅读 · 0 评论 -
ZOJ 3612 Median(二分)
本该是线段树的题目,二分也勉强能过#include #include #include #include #include using namespace std;const int maxn=10010;char buf[50];long long val[maxn],n,curSize;int remBinSearch(long long v){ int l=0,原创 2013-04-24 19:33:04 · 583 阅读 · 0 评论 -
ZOJ 2830 Champion of the Swordsmanship
每次都尽量的除3,然后把除3的结果加上余数,继续下去直到小于等于3为止#include #include #include using namespace std;int n;int main(){ while (scanf("%d",&n)&&n){ int ans=0; if(n==2||n==3)ans=1; else if(n>3) while (1){原创 2013-04-24 19:53:16 · 530 阅读 · 0 评论 -
ZOJ 1227 Free Candies(记忆化搜索)
#include #include #include #include using namespace std;const int maxn=21;int cnt[maxn],grid[maxn*2][4],mxans,n,idx[4],ans;;bool dp[42][42][42][42];void dfs(int tms){ mxans=max(mxans,ans);原创 2013-04-25 06:41:39 · 641 阅读 · 0 评论 -
ZOJ 1544 Currency Exchange(bellman_ford)
因为货币可以无限的进行兑换,所以只要存在正回路就一定能成功#include #include #include using namespace std;const int maxn=110;struct edge{ int u,v; double rate,coms;}es[maxn*2];double dis[maxn],V;int n,m,S;void addEdge原创 2013-04-16 21:12:30 · 683 阅读 · 0 评论 -
ZOJ 1464 Cable Master(二分)
首先对所有的cables按长度从大到小排个序,然后对0.0到最大长度的cable进行二分.#include #include #include #include #include using namespace std;#define eps 1e-4const int maxn=10010;double cb[maxn];int n,m;int main(){ int原创 2013-04-16 21:57:27 · 482 阅读 · 0 评论 -
ZOJ 1354 Extended Lights Out(枚举)
枚举第一行的64种可能,然后对于除第一行的每一个i,j值,若[i-1,j]亮着灯就要把[i,j]开关开起来关掉[i-1,j]的灯#include #include #include using namespace std;bool maze[5][6],ans[5][6],temp[5][6];int cnt[5][6];int di[]={0,-1,1,0,0},dj[]={0原创 2013-04-17 12:40:09 · 511 阅读 · 0 评论 -
ZOJ 2100 Seeding(简单DFS)
#include #include #include using namespace std;const int maxn=8;bool vis[maxn][maxn];char grid[maxn][maxn];int di[]={-1,1,0,0},dj[]={0,0,-1,1},n,m;bool dfs(int ci,int cj,int left){ if(left==0原创 2013-04-25 07:23:09 · 450 阅读 · 0 评论 -
UVA Cutting Sticks(记忆化搜索)
方程f[i,j]=0 if i+1==j,min(f[i,k]+f[k,j]+len[j]-len[i]) if 0#include #include #include using namespace std;int dp[60][60],len[60],n,L;int dfs_mem(int i,int j){ if(i+1==j)return 0; if(dp[i][j]!=原创 2013-04-25 10:32:25 · 439 阅读 · 0 评论