随笔分类 - ACM
摘要:近期所做题目中最好的一道,首先是比较创新不是常规的,另外需要比较好的数学功底能够洞察到一些小细节,然后转化方法貌似有很多,我自己想了很多但是都很差劲,最后实在没办法很无耻地找了解题报告,这篇解题报告感觉写得最好,我就是按照他的思路自己写的代码1A,佩服佩服此大神解题报告 http://hi.baidu.com/lixubd/item/1fbebd2c0389700f43634a5f算法思路都在里面了,我就不写了,我自己独立写了代码,加了很多注释,代码虽然比较多(这道题代码本来就多),然后其实不难读懂说明一点,预处理后的矩阵行和列都翻倍了,我的代码行和列都是从1开始标号的,而那位大神的代码都是从
        阅读全文
            
摘要:在poj上也有 是poj 1420,在poj上AC了,但是在UVA上RE题意:很好理解就是给你一个表格,一些元素已经有数字了,一些元素还不知道,但是它等于某些元素相加的和,要你补完整个表格(行用1到999表示,列用大写字母来表示,用ABC开始一直到ZZZ,这个很容易算出来,26+26*26+26*26*26=18278,字符处理有些麻烦,代码中的funtion函数)这个东西一开始没想到是什么,后来喵了一下解题报告说是拓扑排序,瞬间就懂了,因为有些元素是未知的,未知的元素是由已知的元素相加得到的,那么就是有一个优先关系,看sample就看得出来然后数据较大,打了一半不知道要怎么做了,然后又轻轻喵
        阅读全文
            
摘要:献上题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,
        阅读全文
            
摘要:说白了还是搜索题输入n有n个点,从1到n标号,起点为1,终点为n,下面n行是每个点信息第一个数字是该点所带的能量值,第二个数字是该点的出度m,然后m个数分别是和该店相连的点的标号起点和终点的能量值都是0游戏一开始的能量值是100,没到达一个点,新的能量值等于之前的能量值加上该点的能量值,游戏要求在任何一个的时候能量值都不能小于等于0,问最后能否到达终点另外一个点是可以多次到达的这题不要想复杂了其实很好做当发现有个和为正值的环存在时,直接求看该点能否直接到达终点。如果可以,直接返回true,即winnable。否则,不用做任何的标记。因为不会再去探索它是否可以直接到达终点。在搜索的过程中看看有没
        阅读全文
            
摘要:图的搜索,双重搜索题意:(折腾的UVA又是好难懂的题意),给你一个h行w列的矩阵输入(标准的),注意输出w h,别颠倒过来。然后只有三种点 '*' , '.' , 'X'其中X和*一起称为区域I,在区域I中相连的X称为区域II , 输出就是输出m个数字,其中m就是区域I的个数,这m个数字中第i个数字num[i]表示某块区域I一面又多少个区域II其中相连是两个格子有公共边,只有点不行,所以对于一个格子而言有4个相连的格子,分别就是上下左右另外区域I可能是任意形状的,可以看samplesample中就是有4块区域I左上角的区域I有两个X,但是这个两个
        阅读全文
            
摘要:一样的题目,看poj 1386 Play on Words即可
        阅读全文
            
摘要:再学欧拉路无力再写题解报告了,最近写得最难受的一道题,前前后后调试了有10来个小时,就一个这么个BUG#define N 30#define MAX 1010开某些数组的时候把N和MAX写反了但是…………代码还是有问题的,G++一直过不了,一直是WA,C++可以过,等下还要调试,一定要把G++给过了题意:和poj 1386 是一样的题目,不过这次要输出路径,而且要字典序最小做法:用邻接表来构建有向图(我的构建方法和网上找来的不一样,不是用白书介绍的那种模拟链表的头插法,而是直接一点,比较然后插入,已有的元素向后移,感觉在时间上没什么差距)。然后用并查集来判断有向图的基图是否连通(其实直接用邻接
        阅读全文
            
摘要:再学欧拉路,没搞清楚定理错了好几次题意:给你n个单词,要求这些单词相连,要求是前面的字母的尾字母和后面单词的头字母相同,问你这n个单词能不能全部连起来,可以连成一条链或者连成一个环另外单词只有小写字母。很容易想到,顶点集合就是26个小写字母,用1到26来表示,一个单词的首字母和尾字母就是一条有向边,注意是有向边,因为单词是不能倒回来的其实就是问你这个图是否存在欧拉道路(一条链的情况)或者欧拉回路(环的情况),反正存在欧拉路就是成功的,否则就是失败判断有向图是否有欧拉路1.判断有向图的基图(即有向图转化为无向图)连通性,用简单的DFS即可。如果图都不连通,一定不存在欧拉路2.在条件1的基础上 对
        阅读全文
            
摘要:推荐技术公众号:不爱睡觉的大猪 题意:给你n个珠子,一个珠子分为两半有两种颜色,用1到50来表示50种不同的颜色。把这些珠子串起来,两个紧挨着的珠子要满足一个条件就是接触的那部分颜色要相同 例如(1,2)(2,4),两个珠子的接触部分颜色相同都为2。当然,因为珠子最后是连成环的,第一个珠子和最后一个
        阅读全文
            
摘要:题目翻译:1976年“四色定理”在计算机的帮助下被证明。 这个定理宣告任何一个地图都可以只用四种颜色来填充, 并且没有相邻区域的颜色是相同的。现在让你解决一个更加简单的问题。 你必须决定给定的任意相连的图能不能够用两种颜色填充。 就是说,如果给其中一个分配一种颜色, 要让所有直接相连的两个节点不能是相同的颜色。 为了让问题更简单,你可以假设:1. 没有节点是连接向它自己的。2. 是无向图。 即如果a连接b, 那么b也是连接a的3. 图是强连接的。就是说至少有一条路径可走向所有节点。方法一:广搜BFS由题目可知,对于每个结点,所有和它相接的点必须和这个点颜色不一样。那么,很自然可以用广搜来做: 
        阅读全文
            
摘要:最短路入门经典题题意是输入n表示n个点从1到n标号,n=0结束程序然后给出n*n的邻接矩阵,g[i][j]=-1表示i->j没有通路然后有多个查询,输入u,v,输出u->v的最短路并且打印字典序最小的路径,查询以-1 -1结束//除了边的权值之外每个点还附带一个权值,所以在松弛操作的时候要把点的权值也计算进去//另外在总费用最小的情况下要输出字典序最小的路径,同样是在松弛操作那里处理//如果能更新d[i]使d[i]变小则直接更新//如果是与d[i]相同则判断一下如果更新的话会不会使路径的字典序更小,如果能才更新否则不更新//因为由多个查询,显然是用Floy来处理更好,当然也可以写一
        阅读全文
            
摘要:UVA 其实挺折腾的,题目超长,然后题意可能很水,输入输出又奇葩,当做是磨练其实是最短路径的裸题。固定有20个点点,输入分为两部分,前部分有19行,每一行先输出一个n,表示这行有n个数字,然后输入n个数字。第i行输出的数字v表示i和v之间有边而且是无向边,所有边的权值都是1。输入的后部分是先输入一个m,表示有m个查询,下面m行输入点u,v输出两点间的最短路径显然就是Floy算法的裸题。但是新学了spafa,把spfa也放上来注意的是有20个点从1标号到20,但是输入只有19行,再者就是输出的格式也要注意,本题1Y,当做是练手啦SPFA//先给出spafa算法//这个代码中是得到了邻接矩阵后再输
        阅读全文
            
摘要:最短路径裸题 ,用了dijkstra , Floy , Bellman-Floy 算法实现,纯粹练手Dijkstra_数组模拟邻接表_优先队列STL实现#include <cstdio>#include <cstring>#include <queue>#include <utility>#define N 210#define M 2020 //有1000条无向边,要转化为两条有向边保存#define INF 0x3f3f3f3fusing namespace std;typedef pair<int,int> pii;struct
        阅读全文
            
摘要:最小生成树裸题,给出n个点的坐标,求MST的权值总和,用prim实现#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>#define INF 100000000.0#define N 110using namespace std;double x[N],y[N],dis[N][N],lowcoat[N];bool vis[N];int n;double DIS(int i , int j){ return sqrt( (x[i]-x[j])*(x[i
        阅读全文
            
摘要:这个OJ比较折腾,中文注释什么的都要注意,本来代码是1Y的,但是因为中文注释的问题CE和TLE了无数次,把中文注释消掉一部分后就AC了,一位同学说是中文注释的换行问题,所以如果这个代码copy过去不能AC而是什么CE,TLE甚至WA的话,那不是代码的问题应该是一些细节问题,可以搞搞中文注释什么的大概就过了最短路径的变形给出有向边u->v,后面跟两个数据一个是走这条边要用的时间,之后是到达v点后会有红绿灯,每次红绿灯的时间,,一开始所有红绿灯都是从红灯开始的用dij算法来时间,具体的做法只是修改了一下dij算法的模板//判断红绿灯的方法是 当前是时间t和这个点的红绿灯时间w//(t/w)%
        阅读全文
            
摘要:搜索水题,其实就是一个图的遍历(因为放在数据结构图专题中)给你一个图,以一整行的"_________"作为这个图的结束然后"X"表示不能到达,空格是能到达的,"*"也是可以到达的,并且是一个起点,要求从所有的起点出发,能到达的地方都标记为"#"然后输出标记后的整个图,"_______"也是要输出的另外注意这个图不一定是一个矩阵,可能是不规则的,例如XXXXXXXXXX X XX * XX X XXXXXXXXXXX XX XX XXXXXX_____当然这些都是没有关系的,就直接遍历好了,已经标
        阅读全文
            
摘要:欧拉回路裸题,给定n个点和m条有向边,判断该图是否为欧拉回路有向图欧拉回路判断条件有:图连通,所有点的度为偶数代码一,用并查集来判断图是否连通,然后逐一扫描所有点的度是否为偶数#include <stdio.h>#include <string.h>#define N 110int n,m;int d[N];int p[N];int find(int x) //并查集{ return p[x]==x ? x : find(p[x]); }int main(){ int CASE,i,j,u,v,x,y,ok; scanf("%d",&CASE
        阅读全文
            
摘要:题意:一个三维方块,给出高长宽,并且按照从最低面一层(或者从最顶面一层)到最高一层逐层给出这个方块的信息。S表示起点E表示终点,#表示这个格子不能走, .表示这个格子能走,走的方向有6个,前后左右上下。能是否能从起点走到终点,若能输出最少的步数首先想到的DFS+剪枝,后来TLE了,才自己脑子又进水了,应该用BFS,因为剪枝的话效率不高,而且题目求最小步数,显然符合BFS的特点从起点开始,将它能走的6个方向的格子且满足条件的格子入队,满足条件是指,这个格子还在方块内,而且能走,而且没有走过一开始没有记录一个格子是否走过就TLE了,又脑子进水了显然是要记录的………………如果队中某个格子就是终点的格
        阅读全文
            
摘要:其实题意不是很明白,看了别人的解题报告然后按照思路来实现,最后AC了,但是对于题意还是很有问题判断是否有欧拉回路,图要连通(用并查集来处理),然后所有顶点的度数为偶数在这个博客中http://www.cnblogs.com/penseur/archive/2011/02/28/1967412.html说输入的边中要包含所有的点才是存在,但是按照这个AC代码以及网上找回来的大部分代码表明是不需要包括所有代码的例如10 28 99 8输出Possible按照这个AC代码的意思应该是前面的点可以不存在,但是一旦出现了第i个点,那么必须从第i个点到第n-1个点都存在,而且图连通,度为偶数,才存在欧拉回
        阅读全文
            
摘要://滑雪,记忆化搜索解决//dp[i][j]表示从(i,j)开始出发所能滑的最长长度//显然状态转移方程为dp[i][j]=max{上下左右四个方向的dp值}+1;//我们只需要在DP过程中时刻更新最大值MAX即可#include <stdio.h>#include <string.h>#define N 110int R,C;int a[N][N],dp[N][N],MAX;bool vis[N][N];int x[5]={0,-1,1,0,0}, y[5]={0,0,0,-1,1};void DP(int i , int j){ int k,xx,yy,tmp; i
        阅读全文
            
 
                    
                
 
 浙公网安备 33010602011771号
浙公网安备 33010602011771号