摘要: 题意:有n个单词,要求每个单词出现的频率(次数/n),并把这些单词以字典序输出View Code #include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;struct Tree{ int number; char name[35]; Tree *l,*r; Tree() { l=r=0; }}*root;int n;char s[35];void init(Tree *&t,char *s){ if(t= 阅读全文
posted @ 2011-11-23 20:28 104_gogo 阅读(144) 评论(0) 推荐(0) 编辑
摘要: View Code #include <stdio.h>#include <string.h>#include <math.h>char ans[1000000];void dfs(int s,int e){ int i,len; if(e-s==1) { ans[s]='-'; return; } len=(e-s)/3; dfs(s,s+len); dfs(s+2*len,e);}int main(){ int i,n,len; while (scanf("%d",&n)!=EOF) { ... 阅读全文
posted @ 2011-11-18 20:01 104_gogo 阅读(320) 评论(0) 推荐(0) 编辑
摘要: View Code #include <stdio.h>#include <string.h>char pre[30],ino[30],ar[100000];int len;void T(int k,int s,int e,int now){ int i; if(s>e)return; ar[now]=pre[k]; for(i=s;i<e;i++) { if(ino[i]==pre[k])break; } T(k+1,s,i-1,now*2); T(k+i-s+1,i+1,e,now*2+1);}void p(int i){ ... 阅读全文
posted @ 2011-11-18 20:00 104_gogo 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 注意:1.开头系数是负的话,负号后面没有空格;如果是正的话,不输出正号和空格2.系数是1的话,不输出1;如果是-1的话,也不输出13.指数是1的话,不输出^14.最后一位,不输出x^0View Code #include <stdio.h>int ar[10],i;void solve(int j){ if(ar[i]!=0) { if(i==j)//是头 { if(ar[i]>0) { if(ar[i]==1)printf("x^%d ",i); e... 阅读全文
posted @ 2011-11-16 21:28 104_gogo 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 思路:把所有的单词存到字典树中,然后把句子中的字母全改成小写的,就剥离句子中的单词,在字典树中查找View Code #include <iostream>#include <string.h>#include <stdio.h>using namespace std;struct trie{ int flag; char ch; trie *next[26]; trie() { flag=0; memset(next,0,sizeof(next)); }};int Max,ar[25];char s[100],str[25][1... 阅读全文
posted @ 2011-11-16 18:52 104_gogo 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 二分的时候左边的初始值弄错了,一直wa.5 31 1 1 1 101 / 1 1 1 / 10View Code #include <stdio.h>int m,n,k,a,ar[505];void solve(int mid){ int i,j,s=0; for (i=0;i<n;i++) { if(ar[i]+s<=mid)s+=ar[i]; else { s=ar[i]; k++; } }}void print(){ int i,j,sum,cnt=1,pre... 阅读全文
posted @ 2011-11-16 13:42 104_gogo 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 我的做法是,用栈把能stable的去掉,把剩下的左空号和右括号的个数分别算出来n,m,n和m肯定同奇同偶如果是偶数的话,}}{{——>{}{},2次操作:n/2+m/2;如果是奇数的话,}}}{——>{}{},3次操作:(n-1)/2+(m-1)/2+2;View Code #include <stdio.h>#include <string.h>int n;char stack[2005];void Push(char ch){ stack[++n]=ch;}char Pop(){ if(n-1==-1)return '0'; return 阅读全文
posted @ 2011-11-14 13:26 104_gogo 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 0-1背包真是没想到..View Code #include <stdio.h>int dp[25][15005];int main(){ int C,G,i,j,k,c[25],g[25]; scanf("%d%d",&C,&G); for (i=0;i<C;i++)scanf("%d",&c[i]); for (i=1;i<=G;i++)scanf("%d",&g[i]); dp[0][7500]=1; for (i=1;i<=G;i++) { for (j=0;j&l 阅读全文
posted @ 2011-11-14 10:43 104_gogo 阅读(147) 评论(0) 推荐(0) 编辑
摘要: if(a>dp[i-j])dp[i]=min(dp[i],2*t+a); else dp[i]=min(dp[i],2*t+dp[i-j]);dp[i]表示第i个车到达对岸花的最少时间由于第 i 个车可以和它前面的 j(1~n-1)个车一起坐船,所以可以得到dp[i]=min(dp[i],dp[i-j]+2*t);但是第 i 个车到达的时间可能大于了dp[i-j],这样就会等第 i 个车,又得dp[i]=min(dp[i],i 到达时间+2*t);最后一次不用返回了,所以dp[m]-t;船运的次数:num[i]=num[i-j]+1;View Code #include <stdi 阅读全文
posted @ 2011-11-12 19:38 104_gogo 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 抱着试试的态度,居然1A了..方法就是,正向和反向各求一次连续子段和,并且把每达到的位置的最大和保存起来ans=max(ans,sum1[i]+sum2[i+1]);sum1[i]表示第i个数前面的最大连续子段的和,sum2[i+1]表示从i+1个数后面的最大连续子段和View Code #include <stdio.h>int ar[100005],sum1[100000],sum2[100000];int main(){ int n,i,j,sum,max,ans; while (scanf("%d",&n)&&n) { max=a 阅读全文
posted @ 2011-11-12 13:20 104_gogo 阅读(179) 评论(0) 推荐(0) 编辑