2014年第五届蓝桥杯省赛C语言B组

1.啤酒和饮料

思路:有手就行

#include<iostream>
using namespace std;
int main() {
	for(int a=0; a<100; ++a)
		for(int b=0; b<100; ++b)
			if(a<b&&((2.3*a+1.9*b)==82.3))
				cout<<a;
	return 0;
}

答案:11

2.切面条

思路:自己画一画,前几个是这样的:

对折次数得到面条数目
02=2 0+1
13=21+1
25=22+1
39=23+1
417=24+1
n2n+1

这个是找规律的

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	cout<<pow(2,10)+1;
	return 0;
} 

答案:1025

3.李白打酒

思路:同2013年的“第三十九级台阶”:https://blog.csdn.net/firewater23/article/details/107719282#3_60

#include<iostream>
using namespace std;
int ans=0;
void fun(int wine,int shop,int flower){
	//题目说最后一次遇到的是花,正好喝完酒 
	//也就是还剩下一朵花,一斗酒,店肯定是没了的 
	if(flower==1&&wine==1&&shop==0){  
		ans++;
		return ;
	}
	//这里两种情况要分类,注意if语句的判断 
	if(shop>0) fun(wine*2,shop-1,flower); 
	if(flower>0) fun(wine-1,shop,flower-1);
}
int main(){
	fun(2,5,10);
	cout<<ans;
	return 0;
} 

答案:14

4.史丰收运算

思路:没啥思路
看到while语句里的条件是r==0,内部里面第一个if语句里是r<0
那么下面肯定也是个if语句,并且条件是r>0,这个应该不难猜到
然后后面的执行语句肯定和i有关,不然循环出不去,然后不可能和上一句一样,也是i+1,就没意义了。试着试着就出来了。

for(i=5; i>=0; i--) {
		int r = strcmp(level[i], buf);
		if(r<0) return i+1;
		while(r==0) {
			p += 6;
			strncpy(buf,p,6);
			r = strcmp(level[i], buf);
			if(r<0) return i+1;
			if(r>0) return i;  //填空
		}
	}

答案:if(r>0) return i

5.打印图形

思路:这个似乎也是试出来的
要填第一行,我先是用rank=3带进去分别注释掉第二行和第三行,结果都是最后一行**有变化,说明要我们补全的第一行肯定是上方的空白部分
那整体格式就是f(a, rank-1, ,);
后面两个值就一边试一边看运行结果,然后修改。

void f(char a[][N], int rank, int row, int col) {
	if(rank==1) {
		a[row][col] = '*';
		return;
	}
	int w = 1;
	int i;
	for(i=0; i<rank-1; i++) w *= 2;
	f(a, rank-1, row, col+w/2);//上边的几层 填空处    @ 第一行
	f(a, rank-1, row+w/2, col);//最左边的一颗         @ 第二行
	f(a, rank-1, row+w/2, col+w);//最右边的一颗       @ 第三行
}

答案:f(a, rank-1, row, col+w/2)

6.奇怪的分式

思路:可以暴力枚举加以判断,可以深搜再判断。
注意: 但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

#include<iostream>
#include<algorithm>
using namespace std;
int ans=0;
int a[9]= {0};
void dfs(int n) {
	if(n==4) {
		if(a[0]!=a[1]&&a[2]!=a[3])
			if (a[0] * a[2] * (a[1] * 10 + a[3]) == a[1] * a[3] * (a[0] * 10 +a[2]))
				ans++;
		return ;
	}
	for(int i=0; i<9; ++i) {
		a[n]=i+1;
		dfs(n+1);
	}
}
int main() {
	dfs(0);
	cout<<ans;
	return 0;
}

答案:14

7.六角填数

思路:这是一道典型的深搜题目。
坑点是你需要给出的数组要去除题目已经给到的,数字1 3 8 都是不能再次出现的
一道题目是无法明白深搜的,需要自己多看多练

#include<iostream>
#include<cstring>
using namespace std;
int num[9]= {2,4,5,6,7,9,10,11,12};
bool vis[9]={0};
int a[10];
bool isOk() {
	int s1,s2,s3,s4,s5,s6;
	s1=1+a[1]+a[9]+a[5];
	s2=1+a[2]+a[4]+a[8];
	s3=a[3]+a[2]+a[1]+8;
	s4=a[3]+a[4]+a[7]+3;
	s5=a[5]+a[6]+a[7]+a[8];
	s6=8+3+a[9]+a[6];
	if(s1==s2&&s2==s3&&s3==s4&&s4==s5&&s5==s6) {
		printf("%d",a[9]);
		return 1;
	}
}
void Dfs(int n) {
	if(n==10&&isOk())
		return ;
	for(int i=0; i<9; i++) 
		if(!vis[i]) {
			a[n]=num[i];
			vis[i]=1;
			Dfs(n+1);
			vis[i]=0;
		}
}
int main() {
	Dfs(1);
	return 0;
}

答案:10

8.蚂蚁感冒

起初想到的是把这些数字取绝对值放在另一个数组里,然后sort一下,标记第一个感冒的蚂蚁的位置,然后解决正负的方向,就有点昏了,主要是没想到“穿过**”。
参考了https://blog.csdn.net/computer_liuyun/article/details/23350077
思路:
蚂蚁相遇传染感冒,同时两个都掉头,此时两个都感冒。
这里的相遇掉头其实是穿过,因为两个都感冒了,不再区分哪个蚂蚁往哪边走 。
总的蚂蚁感冒数=左边向右的蚂蚁+右边向左的蚂蚁+本身
特殊情况 :
第一只蚂蚁向左,并且它的左边没有向右的。
第一只蚂蚁向右,并且它的右边没有向左的。
这两种情况任意发生一种都会导致第一个蚂蚁无法将感冒传给其他蚂蚁

#include<iostream>
#include<cmath>
using namespace std;
int a[50];//存放蚂蚁位置的数组 
int n;

int main() {
	cin>>n;
	for(int i=0; i<n; ++i)
		cin>>a[i];
	//a[0]是感冒的蚂蚁
	int left=0,right=0;
	for(int i=1; i<n; ++i) {
		if(a[i]>0) {   //向右走
			if(abs(a[i])<abs(a[0]))   //在感冒蚂蚁的左边
				right++;
		}
		if(a[i]<0) {  //向左走
			if(abs(a[i])>abs(a[0]))   //在感冒蚂蚁的右边
			        left++;
		}
    }
   //处理特殊情况
    if((a[0]<0&&right==0)||(a[0]>0&&left==0))
		cout<<"1";
	else cout<<left+right+1; 
	return 0;
}

后面不会了,,,,
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值