03 2014 档案

摘要:想多了!以为一直dfs所有的情况会超时,所以直接忽略了,就自己想了一个优化的算法,最后测试结果对了,但是wa了,自己写算法很容易考虑不周的,还是在最后没有办法的时候在考虑自己的算法吧!!!简单的dfs就可以了!#include#include#define Max 100char goal_str[Max];char source_str[Max];char stack[Max];int path[Max];int lenth,top,pointer;void print_path(void){ int i; for(i=0;i0&&stack[top-1]==goal_str 阅读全文
posted @ 2014-03-31 21:59 keyboard3 阅读(175) 评论(0) 推荐(0)
摘要:就是套了个prim算法就ac了#include #include #define MaxInt 0x3f3f3f3f#define N 510/*创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问*/int map[N][N],low[N],visited[N];int n;int prim(){ int i,j,pos,min,result=0; memset(visited,0,sizeof(visited));/*从某点开始,分别标记和记录该点*/ visited[1]=1;pos=1;/*第一次给low数组赋值*/ ... 阅读全文
posted @ 2014-03-30 17:35 keyboard3 阅读(187) 评论(0) 推荐(0)
摘要:其实就是一个拓补排序。(动态记录第i个之上的j存不存在,反过来就是第j个之下的i)首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)。/*可以通过搜索,搜索到该框的所有四个角*/||如果题目要求在严格一点,这个题目难度几何增加,在一定范围内是可算顺序的。检查边框的位置如果不是原来的字母,则说明原来的字母被现在的字母覆盖,得到一个局部大小关系(计算第j个下i的数量,0的话就确定下来这个j的位置了),接下来的就是拓补排序了。值得一提的是如果有多种可能的话,要按字典顺序逐个输出。(隐含的就是在循环遍历,默认条件就是字典顺序)#include#includeint topo[26][26];c 阅读全文
posted @ 2014-03-28 20:02 keyboard3 阅读(337) 评论(0) 推荐(0)
摘要:这道题困扰我的不是算法问题。而是细节问题。不优化一直搜到底 时间是690ms左右没有优化的dfs#include#include#includechar map[10][10]; int flag[10][10]; int way[4][2]={ 0,1,0,-1,1,0,-1,0 }; typedef struct { int x,y; } point; point sta; int n,m; int t; int dfs( int s,int x,int y ) { int i,xx,yy; if( map[x][y]=='D' && s==... 阅读全文
posted @ 2014-03-26 17:25 keyboard3 阅读(179) 评论(0) 推荐(0)
摘要:#include#includeint a[1000005];int main(void){ int t,n,m,i,len,max,min,mx,mi; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); len=0; max=0;mi=1000005,mx=0,min=0; for(i=0;ilen) { mi=len; if(a[i]>n/2... 阅读全文
posted @ 2014-03-25 16:35 keyboard3 阅读(134) 评论(0) 推荐(0)
摘要:#includeint main(void){ int kil; int flag=0; double sum; while(scanf("%d",&kil)&&kil!=0) { sum=0; flag=0; while(kil) { if(kil<=4) { sum+=10; kil-=kil; } else if(kil<=8) { ... 阅读全文
posted @ 2014-03-25 15:33 keyboard3 阅读(129) 评论(0) 推荐(0)
摘要:所有车子到达的总时间算出来,然后从小到大排序,如果:1. 开始时间 0 的,Charley 和最早到达的车子一起到达。还有一种就是如果就是Charley一个人的时候,那么就按照他自己的速度达到目的地#include#include#includetypedef struct{ int v; int settime; int time;}person;person p[10010];int cmp(const void *a,const void *b){ person *c=(person *)a; person *d=(person *)b; retur... 阅读全文
posted @ 2014-03-25 14:51 keyboard3 阅读(179) 评论(0) 推荐(0)
摘要:这题解决的算法处理,真的很难想清楚!!尤其是最后的正矩形如何处理。不过终于看懂了#include#include#include#include#define MAX 110 #define min(a,b) ((a)<(b))?(a):(b)char board[MAX][MAX]; int sum[MAX][MAX]; int main(void) { int n,i,ans,j,len,k; while(scanf("%d",&n)!=EOF) { memset(sum,0,sizeof(sum)); /*初始化每个点的个数为0*/ mems... 阅读全文
posted @ 2014-03-25 13:28 keyboard3 阅读(306) 评论(0) 推荐(0)
摘要:/*根据题意:不难看出,要是整个方程式最小,那么应该大的数先结合,小的数后结合。先排序然后结合(贪心) */ #include#include#includeint cmp(const void *a,const void *b){ return (*(int *)a<*(int *)b);} int main(void){ int a[101]; double sum; int n,i; while(scanf("%d",&n)!=EOF) { sum=0; for(i=0;i<n;i++) scanf("%d",... 阅读全文
posted @ 2014-03-24 18:13 keyboard3 阅读(118) 评论(0) 推荐(0)
摘要:/*如果要一个物体的多种属性,最好用结构体,不要用二维数组或者多维数组。用多维数组进行关键字排序很不稳定 */ /*给每个设备的所有价格排序,每个设备选取恰好比已知带宽大的价格(这个时候的比例最大) 循环每个设备就得到所有价格综合 然后得到该带宽下的B/P比较所有带宽的B/P 选取最大的就是所求的*/ #include #include #define true 1#define false 0 typedef struct { int b, p; }SYS;SYS sys[100][100];int cmp(const void * a, const void * b){ SYS * c.. 阅读全文
posted @ 2014-03-24 17:26 keyboard3 阅读(164) 评论(0) 推荐(0)
摘要:硬币称重,经典,1.若被判平,左右所有硬币必正常;2.若判轻或判重,对应硬币被判轻-1、重记数+1;3.只有球只被判轻或判重,且次数跟天平不平衡次数相等,该球才能是坏的,否则必然是好的。且>0的是偏重,#include#includeint main(void){ int s[15]; int i,j,t,len1,len2,count=0; char str[3][3][13]; scanf("%d",&t); while(t--) { count=0;/*不平衡的次数*/ for(i=0;i<3 ;i++ ) ... 阅读全文
posted @ 2014-03-23 20:46 keyboard3 阅读(198) 评论(0) 推荐(0)
摘要:很简单的DFS搜索水题,递归理解深了很easy的!打了一遍就ac了#includeint atr[25][25];int count=1,n,m;void DFS(int x,int y){ int i=0; for(i=0;i=0&&atr[y-1][x]==0)/*向上有点并且可以访问*/ { count++; atr[y-1][x]=1; DFS(x,y-1); } } else if(i==1) { ... 阅读全文
posted @ 2014-03-22 17:21 keyboard3 阅读(229) 评论(0) 推荐(0)
摘要:其实这道题目,我感觉就是一道数学题,仔细观察题目的规律可知,举例吧!就用题目中的这两个例子。1,a b c 3 5 4那么如何可以得到4呢!2*b-2*a=2*5-2*3=4 即 (b-a)+(b-a)=4 正号可以看做满水,b-a可以看做是b的水倒向a2,a b c 5 7 3这个可以拆解为 2*a-b=3 即 2*5-7=3 当然这只是第一步,得到每个那个壶先灌了几次水,那个壶向那个壶转了几次水。然后就可以推出倒了几次水。剩下就简单了,考验你的分析能力了!!!#include#includeint Max(int n,int i,int m,int j){ if((i*n-j*m)... 阅读全文
posted @ 2014-03-19 19:36 keyboard3 阅读(412) 评论(0) 推荐(0)
摘要:快排的效率很快,但是我们很少知道如何利用它进行多关键字排序,比如我想对一个数组a[i][0]进行的一个元素进行主关键字排序,又想对a[i][1]进行次关键字排序。那么接下来就是解决这个问题的方法。 学过数据结构的同学,应该知道快排的基本原理,就是将要排序的物品(不说成值,因为我们可能要排多维数组或者是结构体),就是每次将一个物品放到序列中最合适的位置,那么如何放,如果想要递增排序,就是前面的物品和后面的物品,谁大的放后面。所以通过这个原理就知道void qsort(void*, size_t, size_t, int*(const void*, const void*));这个函数传参数的.. 阅读全文
posted @ 2014-03-17 10:32 keyboard3 阅读(1672) 评论(0) 推荐(0)
摘要:这道题告诉我想法正确是多么重要,先是我自己想的时候没考虑到最后的页码作为循环的终止,我一直以区间个数来终止循环,这是多么愚蠢啊!然后,我看了别人的代码,但是很不幸超时了!我自己wa的代码,我感觉很正确就是对不了!#include#include#includeint cmp(const void *a,const void *b){ return (*(int *)a-*(int *)b);}int main(void){ int t,n,i,j,count,k,temp; int s[5002][2]; scanf("%d",&t); while(t--) { s 阅读全文
posted @ 2014-03-16 00:12 keyboard3 阅读(305) 评论(0) 推荐(0)
摘要:#include#includeint s[110][110],h;int main(int argc, char* argv[]){ int t,i,n,k,m,x,y,count,sum,j; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&h); memset(s,0,sizeof(s));/*初始化矩阵所有的值为0*/ for(i=0;i=h)/*如果有超过一个共同的好友就可以更新矩... 阅读全文
posted @ 2014-03-10 22:11 keyboard3 阅读(147) 评论(0) 推荐(0)
摘要:/*很简单的一题,求连续的m位,求总和最多的值,循环找一下,就出来了*/ #includeint d[210];int main(int argc, char* argv[]){ int t,i,j; int n,m,sum,max; while(scanf("%d",&t)!=EOF) { while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&d[i]); m... 阅读全文
posted @ 2014-03-10 21:59 keyboard3 阅读(144) 评论(0) 推荐(0)
摘要:刚开始没注意它规定的范围,就是用了位运算。感觉挺好。已提交超时了!回头看它的数组非常大,一个循环内部稍微多几步操作就会超时#include#includechar str[3000006];int main(int argc, char* argv[]){ int t,i; int len; int pre,later; while(scanf("%d",&t)!=EOF) { getchar(); while(t--) { gets(str); ... 阅读全文
posted @ 2014-03-10 21:13 keyboard3 阅读(249) 评论(0) 推荐(0)
摘要:/*看英文和图我头都大了,不过很简单的。*/ #include#includeint s[505][505],q[506],w[506];int main(int argc, char* argv[]){ int t,n,m,i,j; int count; scanf("%d",&t); while(t--) { memset(s,0,sizeof(s)); count=0; scanf("%d%d",&n,&m); for(i=0;i<m;i++) scanf("%d",&q[i]);... 阅读全文
posted @ 2014-03-10 21:04 keyboard3 阅读(150) 评论(0) 推荐(0)
摘要:/*理解题意后,发现最后剩下的都是个数并不是和奇数偶数等有直接的关系,所以我们直接从数量入手比如11会被分为5,6.5再分2,3.6再分3,3只要剩下三个就算一种,少于三个不用算。大于3个继续分很简单,这里循环处理还涉及到分支循环,类似于二叉树。这种情况明显用递归 */ #include#includeint zb(int);int main(int argc, char* argv[]){ int n,i,count; while(scanf("%d",&n)!=EOF) { count=zb(n); printf("%d\n",count); 阅读全文
posted @ 2014-03-10 20:54 keyboard3 阅读(210) 评论(0) 推荐(0)
摘要:/*和网上其他方法一样打表一样,找规律打表*/ #includeint main(void){ long long int table[100]={1,2,5,10,20,25,50,100,125,200,250,500};/*用long long int 为了防止超过int范围之后它自动的不算了, 导致后面的就成了无效值,无法判断该值是否大于Int的范围*/ int i,n,m,count,temp,l; for(i=12;i=2147483647) /*如果这个值大于2^31次-1,数组后面就没用了*/ break; } l=i;... 阅读全文
posted @ 2014-03-10 20:39 keyboard3 阅读(154) 评论(0) 推荐(0)
摘要:/*题意:将两个砝码中的其中一个分成两块,三块组合最多有几种情况(可以只有一块,或者两块)。 组合情况 i j m 三块砝码 (i+j)-m=m-(i+j) i+j i-j=j-i i j m (i+m)-j=j-(i+m) i+m i-m=m-i i+j+m (j+m)-i=i-(j+m) j+m j-m=m-j */#include#include#include#includeint he[405];/*砝码组合质量之和作为序号,来判断改质量是否已经访问过(防止有相同的质量再次使用)*/int solove(int n,int m);int main(int argc, char* ar 阅读全文
posted @ 2014-03-10 20:05 keyboard3 阅读(273) 评论(0) 推荐(0)
摘要:这道题,我在网上看到两种dp,不过基本原理是一样的,不过感觉还是后面的一种比较巧妙!因为我对动态不是很熟,自能加上一些自己的理解,写上注释。1)#include #include #includechar str[10003];long long int dp[6][10003]; /*2^63次恰好是longlong int */int main(void){ long long int i,j,len; while(scanf("%s",str) != EOF) { memset(dp,0,sizeof(dp)); len = st... 阅读全文
posted @ 2014-03-10 12:30 keyboard3 阅读(265) 评论(0) 推荐(0)