您的位置:首页 > 编程语言

蓝桥杯 第四届题目详解(附代码)

2015-01-04 14:32 141 查看
1.头文件

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐