随笔分类 - acm
摘要:第13个位置第5个Bit :13>num[4] =>1 第四个bit 13-num[4]=5 :50 ,3-1 第三个Bit 5>num[2](3) 5-num[2]=2 ...#includeint num[45];void init(){ num[0]=1; num[1]=2; ...
阅读全文
摘要:好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组。完全按照自己按照自己的想法打的,没有参考如何被人的代码。调试了一天,居然最后错在一个小问题上,郁闷啊!!!最后终于调试出来了!!一次提交就ac了!!开心溢于言表啊!!!!!!/*trie树:插入: 插入一段字符串: 每个字符作为树的一层(同一层的节点通过兄弟节点项连),每个节点如果有后继节点的话,就把最大的后继放到其后面。 如果字符串结束,就在该节点处,connt++;然后用一个字符串指针指向实际匹配的字符串的地址。查询: 给定一个字符串,通过字符串...
阅读全文
摘要:蛋都疼了,高了半天,Output Limit Exceeded原来是输入的问题,我靠!!以后还是用输入输出c++好,这尼玛!!郁闷!!!!!#include#include#includeusing namespace std;int main(){ int CA; cin>>CA; while(CA--){ char str[106],*start; int t,n,i,j,len,flag,h; start=&str[4]; scanf("%s %d",start,&n); le...
阅读全文
摘要:想多了!以为一直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
阅读全文
摘要:其实就是一个拓补排序。(动态记录第i个之上的j存不存在,反过来就是第j个之下的i)首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)。/*可以通过搜索,搜索到该框的所有四个角*/||如果题目要求在严格一点,这个题目难度几何增加,在一定范围内是可算顺序的。检查边框的位置如果不是原来的字母,则说明原来的字母被现在的字母覆盖,得到一个局部大小关系(计算第j个下i的数量,0的话就确定下来这个j的位置了),接下来的就是拓补排序了。值得一提的是如果有多种可能的话,要按字典顺序逐个输出。(隐含的就是在循环遍历,默认条件就是字典顺序)#include#includeint topo[26][26];c
阅读全文
摘要:这道题困扰我的不是算法问题。而是细节问题。不优化一直搜到底 时间是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==...
阅读全文
摘要:很简单的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) { ...
阅读全文
摘要:其实这道题目,我感觉就是一道数学题,仔细观察题目的规律可知,举例吧!就用题目中的这两个例子。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)...
阅读全文
摘要:这道题告诉我想法正确是多么重要,先是我自己想的时候没考虑到最后的页码作为循环的终止,我一直以区间个数来终止循环,这是多么愚蠢啊!然后,我看了别人的代码,但是很不幸超时了!我自己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
阅读全文
摘要:#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)/*如果有超过一个共同的好友就可以更新矩...
阅读全文
摘要:/*很简单的一题,求连续的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...
阅读全文
摘要:刚开始没注意它规定的范围,就是用了位运算。感觉挺好。已提交超时了!回头看它的数组非常大,一个循环内部稍微多几步操作就会超时#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); ...
阅读全文
摘要:/*看英文和图我头都大了,不过很简单的。*/ #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]);...
阅读全文
摘要:/*理解题意后,发现最后剩下的都是个数并不是和奇数偶数等有直接的关系,所以我们直接从数量入手比如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);
阅读全文
摘要:/*和网上其他方法一样打表一样,找规律打表*/ #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;...
阅读全文
摘要:/*题意:将两个砝码中的其中一个分成两块,三块组合最多有几种情况(可以只有一块,或者两块)。 组合情况 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
阅读全文
摘要:这道题,我在网上看到两种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...
阅读全文
浙公网安备 33010602011771号