摘要:poj3087:http://poj.org/problem?id=3087题意:题意简化之后的就是:给你两个长度均为c的字符串s1,s2,然后给你一个2*c的串ss,现在每次从s2,中取一个,然后再从s1,取出一个(都是从左往右),组成新的串,如果新的的串和ss相同,则说明s1,s2可以通过若干次洗牌,组成ss。现在就是来求这个步数,若存在,则输出,否则输出-1.题解:直接模拟。但是要注意一个问题。就是strcmp(s1,s2)s1,s2后面要加‘\0’,我就是没有注意这个问题结果贡献了4wa。 1 #include 2 #include 3 #include 4 #include 5 #i
阅读全文
摘要:poj2227:http://poj.org/problem?id=2227题意:给你一块矩形区域,这个矩形区域是由一个个方格拼起来的,并且每个方格有一个高度。现在给这个方格灌水,问最多能装多少水。例如555525555这个区域,只有中间的一个方格能装水,因为只有中间的高度比周围都低,所以能装3单位的水。题解:一开始自己也不不知道怎么做,看了黑书p89的介绍才知道怎么做。是这样的,从边界周围的最低处入手,DFS,如果周围的方格比这个高度高,则把这个方格加入最小堆中,如果比这个小,则继续DFS。同时要注意边界的处理。这样一来,每次DFS,都能确定新的边界,并且每次都是从已知边界的最小处进行DFS
阅读全文
摘要:poj2454:http://poj.org/problem?id=2454题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k。题解:这道题一开始我并不知道怎么做,准备采用随机算法,初始化的时候使其分成3堆,然后每次从每一堆中rand一个数,依次的进行交换,但是交了几版,发现都是wa。最后才知道要用贪心。把数字进行降序排序,然后把前2*k个给两堆,只要前两堆都满足大于500*k,如果不满足,那么对于更小的数的组合就不可能满足了。然后最前两堆进行随机算法每次rand一个,然后相互交换,找到满足条件的即可! 1 #include 2 #include 3 #inc
阅读全文
摘要:poj2010:http://poj.org/problem?id=2010题意:给你c个点,每个点有两个属性,一个是成为成绩g,一个是资金f,又给你总资金F,然后让你从这c个点中选出n个,这n个点满足两点:1,n个点的资金和不大于总资金F,2:n个点成绩的中位数尽可能的大。题解:这一题开始自己也没有什么思路,看了别人的思路发现那样的做法好巧妙啊。思路:首先按照成绩给c个点进行排序,然后对于每个i,计算出在i之前选出n/2个点,然后在i之后选出n/2个点,然后枚举每个i,选出最大的成绩。对于i之前的,只要选出n/2个点且资金之和最小的点即可,如果连最小的资金之和都满足不了资金和不大于F,则其他
阅读全文
摘要:poj3414:http://poj.org/problem?id=3414题意:给你两个罐子的体积,然后让你只用这两个罐子量出给定k体积的水。题解:这里可以把两个罐子看成是一个二维的图,然后体积的水就是图中其中一个坐标是k的点。可以直接BFS,每次操作就相当于从当前的点向外扩展,并且记录当前的路径,即可。其中可以用1,2,3,4,5,6六个数字来分别对应六种操作,然后用一个int类型的数组记录路径就可以。#include#include#include#include#includeusing namespace std;struct Node{ int counts1;//第一个pot中.
阅读全文
摘要:poj2531:http://poj.org/problem?id=2531题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大。题解:随机算法#include#include#include#includeusing namespace std;int n;int g[30][30];int vis[30];const int Timelimit=2000;//时间限制是2000int main(){ scanf("%d",&n); for(int i=1;i>g[i][j]; memset(vis,0,sizeof(v
阅读全文
摘要:poj2531:http://poj.org/problem?id=2531题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大。题解:一开始比知道怎么办,想用搜索,但是20的范围,觉得范围有点大,所以没敢打,最后还是试了试结果竟然过了。#include#include#include#includeusing namespace std;int a[24],b[24];//记录图中的两部分int num1,num2;int counts,minn;int vis[24];int n;int g[24][24];void DFS(int x){//对于一个
阅读全文
摘要:poj3126:http://poj.org/problem?id=3126题意:给你两个数n,k,两个数都是四位数的素数。现在让你改变n的一位数,让n变成另外一个素数。然后把这个素数在改变其中的以为又变成一个新的素数,问你最少有这样变换几步,才能使得使他变成k。题解:求最短的问题,很自然的就想到了BFS,此外这一题还要处理10000以内的素数,可以采用素数筛法。#include#include#include#include#includeusing namespace std;int prime[100001];//标记该数是不是素数struct Node{ int x; int step
阅读全文
摘要:poj3278:http://poj.org/problem?id=3278题意:给你一个n和k,n可以加1也可以减1,还可以乘2,现在要求n经过这样的几步变换可以使得n==k;求得最小的步数。题解:一开始我也不知道怎么办,准备用深度优先搜,但是自己没打出来,后来看了网上题目归类是BFSBFS,马上懂了,就是一个3入口的BFS。裸题。不过要注意0*2的情况。#include#include#include#include#includeusing namespace std;int n,k;int counts[100002];struct Node { int x; int step; ..
阅读全文
摘要:poj2488:http://poj.org/problem?id=2488题意:给你一张地图,然后有一个骑士,骑士可以从地图的任意一个方格开始,作为起点,问你该骑士能否走遍整张题图。题解:首先想到就是DFS,但是要对每个点进行一次DFS,时间复杂度估计hold不住,后来一想,有些点,不必搜索。因为已经收过,所以可以采取记忆化搜索。但是这一题的难点不是这里,在于所谓的字典序输出,一开始不知道这里的字典序是指什么。后来才知道,就是找字母小的,字母相同就找数字小的,这样一来搜索到额顺序就确定了。#include#include#include#include#includeusing namesp
阅读全文
摘要:poj3083:http://poj.org/problem?id=3083题意:给你一个迷宫,然后给你一个起点和终点,现在给你种规则,一种是先向左,无法向左则向前,无法向前则向右,否则则向后,另外一种就是求最短路程,然后一种就先向右,向前,向左,向后,分别求出这三种情况下所走的路程。题解:求最短的路程只需BFS即可,先向左可以DFS,每次DFS记录来自的方向,对于不同的方向,采取不同的搜索顺序,即可。向右的同理。#include#include#include#include#includeusing namespace std;char map1[42][42];int counts[42
阅读全文
摘要:poj2251:http://poj.org/problem?id=2251题意:给你一个三维的立方体,然后给你一个起点,和终点的坐标。然后让你求从起点到终点的最短路程。题解:该题就是求三维的最短路,可以采用BFS,三维的BFS。#include#include#include#include#includeusing namespace std;int counts[32][32][32];//记录到起点的最短距离struct Node{ int x; int y; int z; int step;};int n,m,l;//长,宽,高char map1[32][32][32...
阅读全文
摘要:poj1129:http://poj.org/problem?id=1129题意:给你一个图,然后求图的最小的顶点着色情况。题解:可以采用近似有效算法。对于一个顶点,检查与他相邻的顶点的着色情况,如果对于当前的,这种颜色,她相邻的顶点没有着上,那么这个点就可以染上这种颜色,否则把当前的颜色加1,然后重新检查直到满足为止.最后统计一下一共然后多少种颜色即可。#include#include#include#includeusing namespace std;int color[27];//记录颜色的使用情况,每个点的着色情况int map[27][27];//储存图int n,c;//点的个数
阅读全文