2014第五届蓝桥杯C/C++程序设计本科B组省赛试题解题报告

第一题

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{

for(int i=0; i*2.3<=82.3; ++i)
{
//j = (82.3-2.3*i)/1.9
//j is positive number? i less then j?
double j = (82.3-2.3*i)/1.9;
//cout << i << " " << j << endl;
if(j-(int)j<1E-9 && i<(int)j)
{
cout << i << endl;
break;
}
}
return 0;
}

第二题

对折n次就是得到 2^n+1次。

第三题

暴力(搜索,全排列,二进制枚举)或者根据根据规律递推。详情见代码。

我的代码-C++STL全排列

#include <iostream>
#include <algorithm>
using namespace std;
bool check(char a[])
{

if(a[14] == 'a')
return false;
int v = 2;
for(int i=0; i<15; ++i)
{
if(a[i]=='a')
v *= 2;
else
v -= 1;
}
if(v == 0)
return true;
else
return false;
}
int main()
{

char a[]= "aaaaabbbbbbbbbb";
//char a[] = "babaabbabbabbbb";
int ans = 0;
do
{
if(check(a))
{
++ans;
//for(int i=0; i<15; ++i)
// cout << a[i] << " ";
//cout << endl;
}
}while(next_permutation(a,a+15));
cout << ans << endl;
return 0;
}

我的代码-二进制枚举

#include <iostream>
#include <algorithm>
using namespace std;
//a->0
//b->1
bool check(int k)
{

if(~k & 1)
return false;
int v = 2;
int t = 15;
int a = 0;
int b = 0;
while(t--)
{
if(k & (1<<t))
{
++b;
v -= 1;
}
else
{
++a;
v *= 2;
}
}
if(v==0 && a==5 && b==10)
return true;
return false;
}
int main()
{

int ans = 0;
for(int i=0; i< (1<<15); ++i)
{
if(check(i))
++ans;
}
cout << ans << endl;
return 0;
}

我的代码-递归

#include <iostream>
#include <algorithm>
using namespace std;

//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int fun(int v,int cur,int anum,int bnum)
{

if(cur==0 && v==2 && anum==0 && bnum==0)
return 1;
if((cur==0 && v!=2) || anum<0 || bnum<0)
return 0;
//当前位填a和b情况之和
int ans = fun(v+1,cur-1,anum,bnum-1);
if(v%2 == 0)
ans += fun(v/2,cur-1,anum-1,bnum);
return ans;
}

int main()
{

cout << fun(1,14,5,9);
return 0;
}

第四题

答案:return i

第五题

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

第六题

#include <iostream>
#include <cmath>
using namespace std;
int main()
{

int ans = 0;
for(int a=1; a<=9; ++a)
for(int b=1; b<=9; ++b)
for(int c=1; c<=9; ++c)
for(int d=1; d<=9; ++d)
{
//(a*c)/(b*d) == (a*10+c)/(b*10+d)
if(a==b || c==d)
continue;
double t1 = (a*c);
t1 /= b*d;
double t2 = (a*10+c);
t2 /= b*10+d;
if(fabs(t1-t2)<1E-9)
++ans;
}
cout << ans << endl;
return 0;
}

第七题

#include <iostream>
#include <algorithm>
using namespace std;
//---------------
// 1
// 8 * * *
//
// * *
//
// * * * *
// 3
//---------------
//convert No
//---------------
// 1
// 3 4 5 6
//
// 7 8
//
// 9 10 11 12
// 2
//---------------
bool check(int a[])
{

if(a[1]+a[4]+a[7]+a[9] == a[3]+a[4]+a[5]+a[6]
&& a[3]+a[4]+a[5]+a[6] == a[1]+a[5]+a[8]+a[12]
&& a[1]+a[5]+a[8]+a[12] == a[6]+a[8]+a[11]+a[2]
&& a[6]+a[8]+a[11]+a[2] == a[9]+a[10]+a[11]+a[12]
&& a[9]+a[10]+a[11]+a[12] == a[3]+a[7]+a[10]+a[2]
)
return true;
return false;
}

int main()
{

int a[] = {0,1,3,8,2,4,5,6,7,9,10,11,12};
do
{
if(check(a))
cout << a[7] << endl;
}while(next_permutation(a+4,a+13));
return 0;
}

第八题

#include <iostream>
#include <algorithm>
using namespace std;
int a[60];
int flag[60] = {1};
int main()
{

int n;
int ans = 1;
cin >> n;
for(int i=0; i<n; ++i)
cin >> a[i];
while(1)
{
//当蚂蚁到0和100时离开,不可能出现-100位置。
//对每只蚂蚁进行位置更新
int k = 0;
for(int i=0; i<n; ++i)
{
// -x >> -(x-1)=-x+1
// x >> x+1
if(a[i]==100 || a[i]==0)
continue;
++a[i];
}
//感染判断
for(int i=0; i<n; ++i)
{
if(a[i]==100 || a[i]==0)
{
++k;
continue;
}
for(int j=i+1; j<n; ++j)
{
if(a[j]==100 || a[j]==0)
continue;
int siteA = a[i]>=0?a[i]:-a[i];
int siteB = a[j]>=0?a[j]:-a[j];
//两种情况:两只蚂蚁到同一位置,两只蚂蚁交叉
if(((!flag[i]&&flag[j])||(flag[i]&&!flag[j])) && siteA==siteB)
{
flag[i] = flag[j] = 1;
++ans;
}
if(((!flag[i]&&flag[j])||(flag[i]&&!flag[j])) && (a[i]/siteA+a[j]/siteB==0) && (siteA==siteB+1 || siteA+1==siteB))
{
flag[i] = flag[j] = 1;
++ans;
}
}
}
if(k >= n)
break;
}
cout << ans << endl;
return 0;
}

下载