摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=289思路:同NYOJ 49 开心的小明 动态规划问题dp代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1001 4 int dp[N]; 5 int c[N],w[N]; 6 int max(int x,int y) 7 { 8 return x>y?x:y; 9 }10 int main()11 {12 int n,v,i,j;13 while (scanf("%d%d&q
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=36思路:dp[i][j]表示 s1 以 i结尾和 s2 以 j 结尾的最长公共子序列长度;if(i==0||j==0) dp[i][j]=0;if(s1[i]==s2[j])dp[i][j]=dp[i-1][j-1]+1else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);代码如下: 1 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 int dp
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=558 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n,m; 6 char a[6]; 7 scanf("%d",&n); 8 while(n--) 9 {10 scanf("%s",a); 11 m=strlen(a);12 if(m==3)13 {14 if((a[0]=='o'...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=117思路:归并排序,表示不太懂。。。。算法分析:这个题的算法是利用归并排序的 merge() 函数,在处理在处理两段时,恰好要比较大小,顺便把逆数也求出来 故时间复杂度o(nlogn); 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 1000010 4 long long ans; 5 int a[N]; 6 void merge(int s1,int e1,int s2,int e2) 7 { 8 int
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=32思路:递归 1 #include<stdio.h> 2 #include<stdlib.h> 3 int a[100]; //存储大数 4 void f(int m, int k) 5 { 6 int i,j; 7 for(i=m;i>=k;i--) 8 { 9 a[k]=i;10 if(k>1)11 f(i-1,k-1);12 else13 {14 fo...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=95算法分析:hash映射 1 #include<stdio.h> 2 #include<string.h> 3 #define N 100010 4 int a[N]; //存放数字t出现的次数 5 int main() 6 { 7 int m,n,i,t,p,ans; 8 scanf("%d",&m); 9 while(m--)10 {11 ans=0;12 memset(a,0,sizeof(a));13 ...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=53 1 #include<stdio.h> 2 int main() 3 { 4 int n,x,t,s,i,j,max; 5 scanf("%d",&n); 6 while(n--) 7 { 8 j=0;s=0,max=0; 9 for(i=1;i<=7;i++)10 {11 scanf("%d%d",&x,&t);12 s=x+t;13 ...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=76 1 #include<stdio.h> 2 int main() 3 { 4 int n,i,m; 5 int f[50]; 6 scanf("%d",&n); 7 while(n--) 8 { 9 scanf("%d",&m);10 f[1]=0;f[2]=1;f[3]=2;11 for(i=4;i<=m;i++)12 f[i]=f[i-1]+f[i-2];13 p...
阅读全文
摘要:地址:思路:其实这个题联系的应该是对递归的理解,但是如果提交递归,会超时,所以应用公式递推的方法递归方法:会TimeLimitExceeded 1 #include<stdio.h> 2 #include<stdlib.h> 3 int f(int n) 4 { 5 if(n>=1&&n<=4) return n; 6 else 7 return f(n-1)+f(n-3); 8 } 9 int main()10 {11 int n;12 while(~scanf("%d",&n),n)13 {14 printf(
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=26思路:筛法求孪生素数 1 //筛法求孪生素数 2 #include<stdio.h> 3 #include<math.h> 4 #include<string.h> //memset函数 5 bool visit[1000001]; //判断是否拜访过 6 int main() 7 { 8 int i,j,n,count; 9 long int m; 10 scanf("%d",&n);11 while(n--)12 {13
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=308题意大概就是找字符串s和它的逆序字符串的最长连续公共子序列 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n,l,i,j,k; 6 char a[55],b[55],c[55][55]; 7 scanf("%d",&n); 8 while(n--) 9 {10 memset(c,0,sizeof(c));11 getchar();12...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=236思路:还是属于贪心系列,按照长度排序,如果长度相同则按重量排序。总是找长度和重量都大于等于前一个木棒,就能计算出最短时间。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct mb 6 { 7 int len; //长 8 int weight;//重量 9 }w[10001]; //定义一个结构体数组 10 bo
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=14思路:贪心算法主要问题是时间的问题,这就需要用到ACM中常用的algorithm库函数 1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 struct node 5 { 6 int first;//开始时间 7 int last; //结束时间 8 }w[10001]; 9 bool cmp(node x,node y)10 {11 if(x.last<y.last) ret
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=456思路:以价值的总和的一半为背包容量,构建0-1背包,只要保证一半的背包容量装的价值最大就行。。因为最大也就是总价值的一半。。 1 //0-1 背包 2 #include<stdio.h> 3 #include<string.h> 4 int val[500001]; //存放当前的最大容量 5 int main() 6 { 7 int n,m,i,j,sum; 8 int a[1001]; 9 scanf("%d",&m);10 wh
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=88思路1:对于汉诺塔求移动次数公式为f(n+1)=f(n)*2+1;此题如果用要求十进制最后六位,f(n+1)=(f(n)*2+1)%100000;每次输入层数,求出移动次数,但如果输入数据很大,利用此公式必定超时,经过多次测试,发现若输入数据大于100005,有如下规律,如:f(123456)=f(23456); f(123456789)=f(23456789)---=f(56789)即略去最高位,但 if(m%100000<6)则需进行此操作 m=100000+m%10;这样就不
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=312思路:同hdu 18岁的生日,不过在这里需要在if(m==2&&d==29&&(!rn(y+20))) {cout<<"-1"<<endl;} 添加!rn(y+20),而18岁的生日不需要添加是由于闰年+18=非闰年这道题不知道咋了,用C++就一直TimeLimitExceeded,换用C语言scanf,printf就AC了。。。。表示不太懂。。。。。。 1 #include<stdio.h> 2
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=189思路:经过推算,如果m和n的最大公约数是1时,狼就会把所有的洞进过一边,这样兔子在劫难逃,如果最大公约数不是1,则狼进的洞口编号就是m的倍数,那么兔子就有可能存活,此题关键是看狼是否按着每隔m-1个洞把所有的洞转完。 1 #include<stdio.h> 2 int gcd(int a,int b) 3 { 4 if(b==0) 5 return a; // 如果b为0则a就是a和b的最大公约数 6 else 7 return gcd(...
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=49思路:01背包问题 考虑使用dp问题 求解,定义一个递归式 opt[i][v] 表示前i个物品,在背包容量大小为v的情况下,最大的装载量。 opt[i][v] =max(opt[i-1][v] , opt[i-1][v-c[i]] + w[i]) //w[i]是容量为c[i]时的装载量解释如下: opt[i-1][v] 表示第i件物品不装入背包中,而opt[i-1][v-c[i]] + w[i] 表示第i件物品装入背包中。 1 #include<iostream> 2 #in
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=254 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 200010 4 int a[N]; 5 int cmp(void const *a,void const *b) 6 { 7 return *(int *)a-*(int *)b; 8 } 9 int main()10 {11 int T,max,count,maxnum,n,i;12 scanf("%d",&T);13 wh
阅读全文
摘要:地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=44思路:这道题也是动态规划的问题,开始的时候受导弹拦截的干扰,以为也要从数据的最后面开始处理呢,结果自己觉得思路不对,感觉别扭,后来写出来之后果然是错误的。然后从最开始进行处理,WA了三次,发现很多小的细节没有做好。最后一次提交,AC。解题思路就是从前往后处理数据,判断前面的数据是否大于0,不断的累加,最后输出最大的和。一些小的细节和思想都可以在代码和注释中有所体现。 1 #include<stdio.h> 2 int a[1000001];//防止函数内部数组过大,出现错误
阅读全文