第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(前四道)
前言
今天来尝试b组!
提示:以下是本篇文章正文内容,下面案例可供参考
一、握手问题
50个人互相握手且不重复
那么第一个和剩下49个握手
第二个和剩下48握手
那么50个握手数枚举代码如下
for(int i=1;i<=50;i++)
for(int j=i+1;j<=50;j++)
sum++;
同理有7个人互不握手
for(int i=1;i<=7;i++)
for(int j=i+1;j<=7;j++)
sum--;
减去不握手的数量最后就是握手数量
完整代码如下
#include<iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=1;i<=50;i++)
for(int j=i+1;j<=50;j++)
sum++;
for(int i=1;i<=7;i++)
for(int j=i+1;j<=7;j++)
sum--;
cout<<sum;
return 0;
}
当然也可以用数学知识直接算出来在输出!
个人感觉这个相对于c组第一道更简单
二、小球反弹
反弹效果图如下
画出图后思路马上变清晰
重回左上角
那么就是
小球下来再弹回去的水平位移是长的整数倍
同样的宽同理
代码如下
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
long long x,y;
long long c=343720,k=233333;
long long t=0;
while(1)
{
t++;
x=t*15;
y=t*17;
if((x%c==0&&(x/c)%2==0)&&(y%k==0&&(y/k)%2==0))
{
printf("%.2f",sqrt(x*x+y*y));
break;
}
}
至于为什么要判断(x/c)%2=0和(y/k)%2=0,那是因为一去一回才能回到上面,只有在上面才能回到左上角
三、好数
要求奇数位上的数是奇数,偶数位上的数是偶数
1.判断位数奇偶
2.判断位上的数奇偶
直接上代码
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int n;
cin>>n;
while(n)
{
int m=n;
while(1)
{
if(m%2==1)m/=10;
else break;
if(m%2==0)m/=10;
else break;
if(m==0)
{
sum++;
break;
}
}
n--;
}
cout<<sum;
return 0;
}
从末尾开始判断,只要出现不满足,即可直接跳出
时间复杂度呢
0<n<10七次方
里面最多进行6次
时间复杂度O(6n)炸不了
四、R 格式
题目给了50%数据让你暴力去算
不过我们就不暴力了
0<n<1000 2^n
肯定是long long 都装不下的
还有位数位为0-1024的浮点型
也肯定装不下
那么必须用高精度
什么是高精度呢
就是把一串特别大的数改成数组的形式来存储
用字符数组输入
再将字符数组转换成整型数组进行运算
因为是2的n次方
那我可以让转换出来的整型数组循环n次×2即可
期间我们记录小数点位置
把小数点移除运算结束再加入小数点
因为题目要求要四舍五入
那么我去找小数点后一位进行判断
舍去或进1
需要注意
如果进1,前一位大于10的处理
代码如下
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n;
char a[10000];
int b[10000]={};
int c[10000];
int k=0;
cin>>n;
scanf("%s",a);
int sum=0,point;
sum=strlen(a)-1;
for(int i=0,j=strlen(a)-1;i<strlen(a);i++,j--)
{
if(a[i]=='.')
{
j++;
point=strlen(a)-i-1;
continue;
}
b[j]=int(a[i]-'0');
}
while(n)
{
n--;
for(int i=1;i<=sum;i++)
{
b[i]*=2;
b[i]+=k;
k=0;
if(b[i]>=10)
{
k+=b[i]/10;
b[i]%=10;
if(i==sum)sum++;
}
}
}
if(b[point]>=5)
{
int x=point;
b[x+1]+=1;
while(b[x+1]==10)
{
b[x+1]=0;
x++;
b[x+1]+=1;
}
}
for(int i=sum;i>=1;i--)
{
if(i==point)break;
cout<<b[i];
}
return 0;
}
很多细节需要在写的时候调整和修改,可以边写边输出,看看自己得到的数组对不对
总结
第一道 概率论题
第二道 要把图画出来,然后就很清晰了
第三道 分支判断
第四道 高精度运算,模板问题