蓝桥杯 第四届题目详解(附代码)
2015-01-04 14:32
141 查看
1.头文件
2. freopen可以使用,但提交代码时别忘了删除。
3.long long定义 __int64 输入输出。
4.2个问题: 一个提交编译类型 一个是使用while(scanf("")!=EOF) 可以么 64M的数组可以开多大?
第四届题目:
1.高斯日记:计算日期。 答案:1799-07-16
View Code
2.排他平方数
View Code
3.振兴中华:跳格子(用的递归)
View Code
4.颠倒的价牌
View Code
5.前缀判断:
6.逆波兰表达式:-----递归的题目! 理解题目含义!
答案: evaluate(x+v1.n+1); ---时间充足时,可以在Dev上面编写一下试试!
// 深刻理解递归!!!这里v1是已经解析的值,那么v2只能是未解析的值了!
7.错误票据:----可能需要点技巧
水题,不打了..
8.买不到的数目:----略暴力也可以过,有人说是np难题的一种。(比赛中想一些枚举方法)
最大的为n,m的最小公倍数,之后i,j枚举n和m的个数即可。
9.剪格子:----递归!图的深搜!------------技巧: 格子周围定义一圈-1,用作判界;设定vis数组防止重复!
View Code
10.大臣的旅费:----树的深搜,这里n个节点,进行n次深搜,维护一个最大max值即可!这里只过了75分。 应该是递归爆栈了。
有一些好的方法:URL:http://www.cnblogs.com/cshhr/p/3584271.html 转自:Cshhr---博客园
//注意: 关于图和树的问题!我们一定要注意重边的情况!!!
View Code
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std; int main() { int i,j,k; freopen("in.txt","r",stdin); printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
2. freopen可以使用,但提交代码时别忘了删除。
3.long long定义 __int64 输入输出。
4.2个问题: 一个提交编译类型 一个是使用while(scanf("")!=EOF) 可以么 64M的数组可以开多大?
第四届题目:
1.高斯日记:计算日期。 答案:1799-07-16
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std; int f[15]={31,28,31,30,31,30,31,31,30,31,30,31}; int main() { int i,j,k;int n; freopen("in.txt","r",stdin); //知识点1: 闰年判断! 是闰年,则2月有29天,全年366天。 scanf("%d",&n);int year=1778,yue=1,ri=1;n=n-245; while(n>0){ if((year%4==0 && year%100!=0) || (year%400==0)){ //今年是闰年 ; if(n>=366) { n=n-366; year++; } else break; } else{ if(n>=365){ n=n-365;year++; } else break; } } printf("%d %d\n",year,n); //打印出到多少年,还有多少天,剩下的手算即可。 printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
View Code
2.排他平方数
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std; int f[25]; int pan(long long n){ char a[20]; sprintf(a,"%I64d",n);//讲n换成字符串。 int flag=1,i; for(i=0;i<strlen(a);i++){ if(f[a[i]-'0']==1){ flag=0;break; }else{ f[a[i]-'0']++; } } return flag; } int pan1(long long n,long long num){ char a[20];int i,flag=1; sprintf(a,"%I64d",num); for(i=0;i<strlen(a);i++){ if(f[a[i]-'0']>0){ flag=0;break; } } return flag; } int main() { int i,j,k; //freopen("in.txt","r",stdin); long long n=203899,num=0; while(n++){ memset(f,0,sizeof(f)); if(pan(n)){ num=n*n; if(pan1(n,num)){ printf("%I64d\n",n);break; } } } printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
View Code
3.振兴中华:跳格子(用的递归)
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std;int num=0; int f[8][8]={{0,0,0,0,0,0},{0,1,2,3,4,5,0},{0,2,3,4,5,6,0},{0,3,4,5,6,7,0},{0,4,5,6,7,8,0}}; void dfs(int x,int i,int j){ if(x==8){ num++;return ; }else{ if(f[i+1][j]==(x+1)) dfs(x+1,i+1,j); if(f[i-1][j]==(x+1)) dfs(x+1,i-1,j); if(f[i][j+1]==(x+1)) dfs(x+1,i,j+1); if(f[i][j-1]==(x+1)) dfs(x+1,i,j-1); } } int main() { int i,j,k; //freopen("in.txt","r",stdin); dfs(1,1,1); printf("%d\n",num); printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
View Code
4.颠倒的价牌
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std; int f[10] ={0,1,2,5,6,8,9}; int f1[10]={0,1,2,5,9,8,6}; int main() { int i,j,k,m; //freopen("in.txt","r",stdin); for(i=0;i<7;i++) for(j=0;j<7;j++) for(k=0;k<7;k++) for(m=0;m<7;m++){ int num=f[i]*1000+f[j]*100+f[k]*10+f[m]; int num1=f1[m]*1000+f1[k]*100+f1[j]*10+f1[i]; if(f[m]!=0 && f[i]!=0 && num1-num>=200 && num1-num<300){ printf("%d%d%d%d-%d%d%d%d=%d\n",f1[m],f1[k],f1[j],f1[i],f[i],f[j],f[k],f[m],num1-num); } } for(i=0;i<7;i++) for(j=0;j<7;j++) for(k=0;k<7;k++) for(m=0;m<7;m++){ int num=f[i]*1000+f[j]*100+f[k]*10+f[m]; int num1=f1[m]*1000+f1[k]*100+f1[j]*10+f1[i]; if(f[m]!=0 && f[i]!=0 && num-num1>=800 && num-num1<900){ printf("%d%d%d%d-%d%d%d%d=%d\n",f[i],f[j],f[k],f[m],f1[m],f1[k],f1[j],f1[i],num-num1); } } //可以找出答案为 9088 题目要求找出答案,则肯定唯一! 找到其中没有重复的数字即可! printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
View Code
5.前缀判断:
*(h++) != *(n++) //千万别忘了加括号,否则会变成对应的数字++
6.逆波兰表达式:-----递归的题目! 理解题目含义!
答案: evaluate(x+v1.n+1); ---时间充足时,可以在Dev上面编写一下试试!
// 深刻理解递归!!!这里v1是已经解析的值,那么v2只能是未解析的值了!
7.错误票据:----可能需要点技巧
水题,不打了..
8.买不到的数目:----略暴力也可以过,有人说是np难题的一种。(比赛中想一些枚举方法)
最大的为n,m的最小公倍数,之后i,j枚举n和m的个数即可。
9.剪格子:----递归!图的深搜!------------技巧: 格子周围定义一圈-1,用作判界;设定vis数组防止重复!
#include <stdio.h> #include <string.h> #include <math.h> #include <time.h> #include <iostream> #include <algorithm> using namespace std; int f[15][15],vis[15][15]; int num;int min1;int n,m; void dfs(int num1,int i,int j,int k){ //k代表包含格子的最小数目 if(k>=min1 || num1>num) ; else if(num1==num){ if(k<min1) min1=k; } else{ if(f[i+1][j]!=-1 && vis[i+1][j]==0){ vis[i+1][j]=1; dfs(num1+f[i+1][j],i+1,j,k+1); vis[i+1][j]=0; } if(f[i][j+1]!=-1 && vis[i][j+1]==0){ vis[i][j+1]=1; dfs(num1+f[i][j+1],i,j+1,k+1); vis[i][j+1]=0; } if(f[i-1][j]!=-1 && vis[i-1][j]==0){ vis[i-1][j]=1; dfs(num1+f[i-1][j],i-1,j,k+1); vis[i-1][j]=0; } if(f[i][j-1]!=-1 && vis[i][j-1]==0){ vis[i][j-1]=1; dfs(num1+f[i][j-1],i,j-1,k+1); vis[i][j-1]=0; } } } int main() { int i,j,k; //freopen("in.txt","r",stdin); while(scanf("%d %d",&m,&n)!=EOF){ num=0;memset(f,-1,sizeof(f)); //for(i=0;i<10;i++) printf("%d ",f[1][i]); for(i=1;i<=n;i++) for(j=1;j<=m;j++){ scanf("%d",&f[i][j]); num=num+f[i][j]; }//总和为num; if(num%2){ printf("0\n"); }else{ num=num/2;min1=1000; vis[1][1]=1; dfs(f[1][1],1,1,1); printf("%d\n",min1); } } //printf("%lf\n",clock()/(double)CLOCKS_PER_SEC); return 0; }
View Code
10.大臣的旅费:----树的深搜,这里n个节点,进行n次深搜,维护一个最大max值即可!这里只过了75分。 应该是递归爆栈了。
有一些好的方法:URL:http://www.cnblogs.com/cshhr/p/3584271.html 转自:Cshhr---博客园
//注意: 关于图和树的问题!我们一定要注意重边的情况!!!
#include <stdio.h> #include <math.h> #include <string.h> #include <algorithm> #include <iomanip> #include <iostream> using namespace std; const int N=1010; int f ;int vis ;int max1;int n; void dfs(int a,int num){ int i,v; if(num>max1) max1=num; for(i=1;i<=n;i++){ if(!vis[i] && f[a][i]){ vis[i]=1; dfs(i,num+f[a][i]); vis[i]=0; } } } int main() { freopen("in.txt","r",stdin); int i,j,k;int a,b,c; scanf("%d",&n); memset(f,0,sizeof(f));memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++){ scanf("%d %d %d",&a,&b,&c); if(c>f[a][b]){ f[a][b]=c;//防止重边! f[b][a]=c; } } max1=-1; for(i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); vis[i]=1;dfs(i,0); } int aa=10;int num=0; for(i=1;i<=max1;i++){ num=num+i+aa; } printf("%d\n",num); return 0; }
View Code
相关文章推荐
- 第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛C/C++本科A组(题目及代码)
- 第四届蓝桥杯本科A组解题报告(和B组相同的题目详见B组解题报告)
- 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案
- 排列序数——详解第五届蓝桥杯决赛题目
- 精选微软经典的算法面试100题(第1-20题) -代码详解(题目选自“结构之法”大侠的博客,答案都是本菜鸟自己做的)
- 【用膝盖写代码系列】(3):NOIP2012普及组题目详解
- 【用膝盖写代码系列】(2):NOIP2011普及组复赛题目详解
- 2013年第四届蓝桥杯全国软件大赛本科A组c++预赛 题目及参考答案
- 2015第六届蓝桥杯Java软件开发本科B组部分题目和代码
- 第四届蓝桥杯本科B组省赛题目解析
- CCF炉石传说题目代码详解C++版(类封装通俗易懂)
- 2013年第四届蓝桥杯B组(C/C++)预赛题目及个人答案(欢迎指正)
- 第四届 蓝桥杯C/C++ 高职 1、题目标题: 猜年龄
- 第四届蓝桥杯C/C++A组题目:振兴中华
- 关于IIC协议之详解,这里代码主要是用于蓝桥杯的开发板上(针对初学者)
- 蓝桥杯 代码填空题 训练 题目集(java)
- 蓝桥杯结果填空题训练部分题目代码
- 山东省第四届蓝桥杯 ///题目标题: 高斯日记//c/c++组
- 2013 蓝桥杯第四届c/c++B组 解题报告(完全解决第四题,代码有点长....)
- 山东省第四届蓝桥杯 ///题目标题:前缀判断//c/c++组