2014年第五届蓝桥杯预赛 C/C++本科B组 快速解题思路及报告(完整

今天看了下成绩表,确定是一等了…唉~ 第二题错了,第8题就交了个错的代码上去,没调试的。 若是机器看题,算一下应该就是80-90分的样子。初赛还是水。 决赛再见!,到现在算是完成了去年帝都归来时,说的的那句,"明年再见"了。 期待今年决赛!

第一题:啤酒和饮料(4′ )(点击看题,含解答,下同)

快速解题思路:蓝桥杯的题,模拟暴力应该是主要考虑的方法,尤其是对于这种小题,大题,想不出能模拟则模拟,毕竟它是按测试数据分组拿分。此题,直接暴力,为避免精度,价格乘以10来算。

#include <iostream>using namespace std;int main(){for(int i = 0; i < 40; ++i){for(int j = 1; j < 43; ++j){if(i > j)continue;if(i * 23 + j * 19 == 823){cout<<i<<" "<<j<<endl;}}}return 0;}

答案:11 (4′ 到手)

第二题:切面条(5′ )

解题思路:一刀切下去有三部分,不管是对折的几次都是分三部分(如下图),那么假设第一部分为t1,第二部分是t2,第三部分是t3.

在此基础上如果折一次,那么t3 = t3′ + t2′ , t2 = t1′ ,t1 = 2^(n-1),(n是当前是第几次折),t1的计算方法就是每次折都是讲横着的面条翻了一倍,然后切下来之

后,因为右边是连着的,所以值是2^(n-1)。 因此方法得证。

快速解题思路: 直接找规律。

#include <iostream>#include <cmath>using namespace std;int main(){int t1 = 1,t2 = 0,t3 = 1;for(int i = 1; i <= 10; ++i){t3 += t2;t2 = t1;t1 = pow(2,i-1);}cout<<t1+t2+t3<<endl;return 0;}答案:1025 (艹蛋啊,少算了一次,交了个513上去,5′ 就这么没了。。。。)

第三题:李白打酒 (8′ )快速解题思路:dfs

答案:14 (8′ 到手了)

#include <iostream>#include <cmath>#include <cstdio>#include <cstring>using namespace std;#define eps 10e-10#define N 15int ans;void dfs(int alco,int store,int flower, int pre){if(store == 0 && flower == 0 ){if(pre == 0 && alco == 0)ans++;return ;}if(store > 0){dfs(alco*2,store-1,flower,1);}if(alco > 0 && flower > 0){dfs(alco-1,store,flower-1,0);}return ;}int main(){ans = 0;dfs(2,5,10,-1);printf("%d\n",ans);return 0;}

第四题:史丰收速算(7′ )

快速解题思路:蒙吧,如果你能直接看懂题意,就直接写就行了。不过你要大概看懂点,不然蒙的概率不大。

答案: if(r>0)return i (7′ 这里我没有写 分号 ; ,因为上面有一个分号,不过有没有都没什么关系,这里多一个分号不影响结果,所以分拿到了)

第五题:打印图形 (12′ )快速解题思路:如果能看到,那么肯定就可以直接写出来,如果半懂不懂的,那么就一点一点分析,先少了那句运行一次,然后看结果,自己再加点东西,大概一两步就能想到用循环递归。然后一个参数一个参数的试试,结果就能很快出来了。

答案:f(a,rank-1,row, col + w/2) (12‘ 到手,蒙对的感觉,那是爽歪歪)第六题:奇怪的分式(11’)

快速解题思路:蓝桥杯的主打解题算法-暴力, 就是在这个时候派上用场的,什么都不用想,直接码。 一个四重循环。(差判需要注意精度,相除记得乘以1.0)

#include <iostream>#include <cmath>#include <cstdio>using namespace std;#define eps 10e-10int main(){int ans = 0;for(int i = 1; i < 10; ++i){for(int j = 1; j < 10; ++j){for(int r = 1; r < 10; ++r){for(int k = 1; k < 10; k ++){if(i == j || r == k)continue;if(fabs( (i*10 + r)*1.0/(j*10+k) – (i*r*1.0)/(j*k)) < eps){//printf("%d/%d : %d/%d\n", (i*10 + r),(j*10+k), i*r,(j*k));ans++;}}}}}cout<<ans<<endl;return 0;}答案:14 (11′ 到手,暴力果然爽)

第7题:六角填数(12’)

快速解题思路:dfs 从上到下,从左到右从1到12标记每一个点。初始化1,8,3. 要求的地方点的标记为6.碰到1,2,12,就直接dfs下一个。

#include <iostream>#include <cmath>#include <cstdio>#include <cstring>using namespace std;#define eps 10e-10#define N 15int a[N];bool vis[N];void dfs(int x){if(x == 1 || x == 2 || x == 12){dfs(x+1);return ;}if(x > 12){int t[6];t[0] = a[1] + a[3] + a[6] + a[8];t[1] = a[1] + a[4] + a[7] + a[11];t[2] = a[2] + a[3] + a[4] + a[5];t[3] = a[2] + a[6] + a[9] + a[12];t[4] = a[8] + a[9] + a[10] + a[11];t[5] = a[12] + a[10] + a[7] + a[5];for(int i = 1; i < 6; ++i){if(t[i] != t[i-1])return ;}cout<<a[6]<<endl;return ;}for(int i = 1;i < 13; ++i){if(!vis[i]){vis[i] = 1;a[x] = i;dfs(x+1);vis[i] = 0;}}}int main(){memset(vis,0,sizeof(vis));vis[1] = 1;a[1] = 1;vis[8] = 1;a[2] = 8;vis[3] = 1;a[12] =3;dfs(1);return 0;}答案:10 (12′ 到手,做这题,在1,2,12这里卡了一下。 无线循环了都。)第八题:蚂蚁感冒(10’)

快速解题思路:uva上有个ants,不过和这个不太一样。这里根据数据模拟比较爽一些,还是暴力。 我用dfs调的暴力。

具体思路:第一个输入时感冒的蚂蚁,它有两种方向,向左或向右。

如果它是向左的:

那么对一组输入数据,输入完之后我们可以知道,在0-100这根直杆上,分别分布着一些蚂蚁,每只蚂蚁都有一个朝向。

那么那只感冒的蚂蚁所在直杆的位置就将直杆以它为中心分成左右两部分,

选择自己所爱的,爱自己所选择的。

2014年第五届蓝桥杯预赛 C/C++本科B组 快速解题思路及报告(完整

相关文章:

你感兴趣的文章:

标签云: