2016蓝桥杯省赛B组

2016蓝桥杯省赛B组

1.煤球数目

#include<bits/stdc++.h>
using namespace std;
int dp[200];
int main(){
    int sum=0;
    for(int i=1;i<=100;i++){
        dp[i]=dp[i-1]+i;
        sum+=dp[i];
    }
    cout<<sum;
    return 0;
}

思路:

每一层煤球个数

0+1->1+2->3+3->6+4

答案:171700

2.生日蜡烛

(枚举)
 
某君从某年开始每年都举办一次生日p a r t y ,并且每次都要吹熄与年龄相同根数的蜡烛。
 
现在算起来,他一共吹熄了236根蜡烛。
 
请问,他从多少岁开始过生日p a r t y的?
 
请填写他开始过生日p a r t y 的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
 
#include<bits/stdc++.h> 
using namespace std;
int age;
int main(){
    
    for(age=0;age<=236;age++){
        int sum=0;
        for(int i=age;sum<236;i++){
            sum+=i;
            
        }
        if(sum==236){
            cout<<age;
            return 0;
        }
    }
    return 0;
}
 
答案:26

3.凑算式

陷阱:每一位从1开始,因为要确切计算所以用double防止整除陷阱,即便是用最小公倍数也会有整除陷阱所以用double。
我的解法
 #include<bits/stdc++.h>
using namespace std;int main(){long long int ans=0;for(double a=1;a<10;a++){for(double b=1;b<10;b++){if(b==a)continue;for(double c=1;c<10;c++){if(c==a||c==b)continue;for(double d=1;d<10;d++){if(d==a||d==b||d==c)continue;for(double e=1;e<10;e++){if(e==a||e==b||e==c||e==d)continue;for(double f=1;f<10;f++){if(f==a||f==b||f==c||f==d||f==e)continue;for(double g=1;g<10;g++){if(g==a||g==b||g==c||g==d||g==e||g==f)continue;for(double h=1;h<10;h++){if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;for(double i=1;i<10;i++){if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;double p=d*100+e*10+f;double  q=g*100+h*10+i;if(a+b/c+p/q==10){ans++;}}}}}}}}}}cout<<ans; 
}

 标准答案:用dfs枚举每一位,因为要求每一位的值所以用搜索dfs。全排列

#include<bits/stdc++.h>
using namespace std;
double a[10];
int ans;
bool visit[10];
void dfs(int index){if(index==9){//9位填满if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8])==10){//对应A~I每一位ans++;return ;}}//dfsfor(int i=1;i<10;i++){//为当前位赋值有1~9这几种可能值if(!visit[i]){//如果这个值没有访问过就赋给当前位visit[i]=true;//这个值被访问a[index]=i;dfs(index+1);//跳去下一层visit[i]=false;//恢复现场}}
}
int main(){
dfs(0);
cout<<ans;
}

 4.交换瓶子

#include <iostream>
using namespace std;
const int N=1e4+6;
int a[N];
int n;
int ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
  cin>>a[i];
}
for(int i=1;i<=n;i++){
  if(a[i]!=i){
    int z=a[i];
    int temp=a[i];
    a[i]=a[z];
    a[z]=temp;
    ans++;
    i--;
  }
}
cout<<ans;
  // 请在此输入您的代码
  return 0;
}

贪心:

从左往右遍历所有瓶子,只要位置不对,就交换他和他应该在的位置上的瓶子,让这个瓶子归位。

5.四平方和

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int n;
  cin>>n;
  for(int a=0;a<=sqrt(n);a++){
    for(int b=0;b<=sqrt(n);b++){
      for(int c=0;c<=sqrt(n);c++){

考点:不要再来一层循环,防超时,当总和确定可以用总和减,然后开方得到d在平方回去验证(因为开放可能是四舍五入不一定刚好是)
     int d=sqrt(n-a*a-b*b-c*c);
        
          if(a*a+b*b+c*c+d*d==n){
            cout<<a<<" "<<b<<" "<<c<<" "<<d;
            return 0;
          
        }
      }
    }
  }
  // 请在此输入您的代码
  return 0;
}

6.快速排序(填空题)

#include <stdio.h>
void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
 
int partition(int a[], int p, int r)
{
    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1){
        while(i<r && a[++i]<x);
        while(a[--j]>x);
        if(i>=j) break;
        swap(a,i,j);
    }
______________________;//填空
    return j;
}
 
void quicksort(int a[], int p, int r)
{
    if(p<r){
        int q = partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    }
}
    
int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;
 
quicksort(a, 0, N-1);
 
for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");
 
return 0;
}

第七题:抽签(填空题)

 
#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024
 
void f(int a[], int k, int m, char b[])
{
int i,j;
 
if(k==N){ 
b[M] = 0;
if(m==0) printf("%s\n",b);
return;
}
 
for(i=0; i<=a[k]; i++){
for(j=0; j<i; j++) b[M-m+j] = k+'A';
______________________;  //填空位置
}
}
int main()
{
int  a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}
分析和答案
#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024void f(int a[], int k, int m, char b[])
{int i,j;if(k==N){ b[M] = 0;if(m==0) printf("%s\n",b);return;}for(i=0; i<=a[k]; i++){//当前这个国家分几个人 for(j=0; j<i; j++) b[M-m+j] = k+'A';//录入当前国家人 f(a,k+1,m-i,b);//答案,k+1表示换下一个国家,m-i表示上一次结束还需要分m人但是这次分了i人所以还要分m-i人,注意M,因为每次结束还需要分的人数不同不能用M。}
}
int main()
{	int  a[N] = {4,2,2,1,1,3};//存放每个国家人数 char b[BUF];//存放当前方案 f(a,0,M,b);return 0;
}

 第八题:方格填数

#include<bits/stdc++.h> 
using namespace std;
int a[10];
int res;
bool st[10];
bool check(){if(abs(a[0]-a[1])==1||abs(a[0]-a[5])==1||abs(a[0]-a[4])==1||abs(a[0]-a[3])==1||abs(a[1]-a[2])==1||abs(a[1]-a[6])==1||abs(a[1]-a[5])==1||abs(a[1]-a[4])==1||abs(a[2]-a[5])==1||abs(a[2]-a[6])==1||abs(a[3]-a[4])==1||abs(a[3]-a[8])==1||abs(a[3]-a[7])==1||abs(a[4]-a[5])==1||abs(a[4]-a[8])==1||abs(a[4]-a[7])==1||abs(a[4]-a[9])==1||abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1||abs(a[7]-a[8])==1||abs(a[8]-a[9])==1||abs(a[6]-a[9])==1)return false;return true;
}
void dfs(int m){if(m==10){if(check()){res++;}}for(int i=0;i<10;i++){if(!st[i]){st[i]=true;a[m]=i;dfs(m+1);st[i]=false;}}
}
int main(){dfs(0);//从第0个位置开始搜 cout<<res;
}

 

 第9题:最大比例

10的9次方要开long longm

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 110;

int n;
LL a[N], b[N], x[N];//a是分子b是分母x是答案
 

LL gcd(LL a, LL b)
{
    return b ? gcd(b, a % b) : a;
}
//辗转相减法
LL gcd_sub(LL a, LL b)
{
    if (a < b) swap(a, b);//辗转相减法一定要a大
    if (b == 1) return a;
    return gcd_sub(b, a / b);//注意虽然是辗转相减法但是指数相减对应的是相除
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> x[i];

    sort(x, x + n);//排序
    int cnt = 0;
    for (int i = 1; i < n; i ++ )
        if (x[i] != x[i - 1])//去重·
        {
//每一项都除以第一项,并且化最简(除以最大的公因数)
            LL d = gcd(x[i], x[0]);
            a[cnt] = x[i] / d;
            b[cnt] = x[0] / d;
            cnt ++ ;
        }

    LL up = a[0], down = b[0];//结果的分子分母
    for (int i = 1; i < cnt; i ++ )
    {
//每一次和之前所求算最大公约数(辗转相减法)
为什么不用gcd因为指数相减更简单。gcd只是更省时。
        up = gcd_sub(up, a[i]);
        down = gcd_sub(down, b[i]);
    }

    cout << up << '/' << down << endl;

    return 0;
}

 

第十题:剪邮票

#include<bits/stdc++.h>
using namespace std;
int ans;
void dfs(int g[3][4],int i,int j){
//对当前点所在连通块dfs,类似于洪水漫灌,4个方向,上下左右。并且要访问当前点,访问过为防止重复遍历就变为0
  g[i][j]=0;
  if(i-1>=0&&g[i-1][j]==1)dfs(g,i-1,j);//上
   if(i+1<=2&&g[i+1][j]==1)dfs(g,i+1,j);//下
    if(j-1>=0&&g[i][j-1]==1)dfs(g,i,j-1);//左
     if(j+1<=3&&g[i][j+1]==1)dfs(g,i,j+1);//右
}
//其实就是连通性检测,因为邮票减下来的要相连所以只有一个连通块(带1的连通块有一个)
bool check(int a[12]){
int g[3][4];//存整个图3行4列,要剪下来的用1目的是二维化
//开始用一维目的是将问题转化为数字的全排列
for(int i=0;i<3;i++){
  for(int j=0;j<4;j++){
    if(a[i*4+j]==1)g[i][j]=1;//一行4列,所以i*4+j
    else g[i][j]=0;
  }
}
int cnt=0;
for(int i=0;i<3;i++){
  for(int j=0;j<4;j++){
    if(g[i][j]==1){//是1才dfs遍历他所在的连通块
      dfs(g,i,j);
      cnt++;
    }
  }
}
return cnt==1;//连通块是1才true,因为这5张邮票要剪下来的一定是相连的
}
int main(){
  int per[]={0,0,0,0,0,0,0,1,1,1,1,1};//将二维格子抽象成一维数组(类比方格填数),1表示要剪下来的邮票(5张)。(7+5)
  //靠的就是7个0和5个1的排序(全排列)
do{
    if(check(per))ans++;//全排列枚举所有情况,check检查满足条件的有
  }while(next_permutation(per,per+12));有重复元素的排列用next_permutation更好因为可以去重(本题多个0,多个1重复元素)
  cout<<ans;

  return 0;
}
注意:
next_permutation用法:这个函数能实现全排列
要先排序在全排列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/880201.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css3手册

布局浮动:做文字环绕效果 弹性盒:单行或单列布局 网格:多行多列布局 弹性盒详细文档见MDN 弹性盒小游戏生成弹性容器和弹性项目默认情况下,弹性项目沿着主轴依次排列,侧轴拉伸 更改方向 通过flex-direction可更改主轴方向主轴排列 通过justify-content属性,可以影响主轴的…

CNN

具体在第五次汇报卷积神经网络是多层感知机(MLP)的变种。卷积神经网络(Convolutional Neural Networks)是一种包含卷积计算且具有深度结构的前馈神经网络,CNN具有表征学习的能力,能够按阶层对输入数据进行平移不变分类。CNN的设计灵感来源于动物视觉系统分级处理信息的能力…

LSTM(Long Short-Term Memory)长短时记忆结构

随着RNN在长序列处理中的应用深入,发现了其难以捕捉长距离依赖的问题。LSTM是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,通过引入了“记忆单元”(Memory Cell)和“门控机制”来控制信息的流动,解决了标准RNN中梯度消失和梯度爆炸的问题。其核心结构可…

MDB2PPT_v2.0 mdb数据转换为PPT

前言: 本软件原名“DataToPowerPoint”,已有将近20年的历史,目的是方便将mdb数据库中的数据导出为ppt进行学习或讲座。2007-9-29曾发布于“网上读书园地”,原先为共享软件,未注册版本有功能限制,如:至多输出30条数据、不能使用高级功能。近期对软件界面的布局等作了一些…

2.7 完成剩余表

今天完成了作业中所有表的建立,还剩余历史查询功能计划明天完成所有内容,并进行测试 今天还通过视频进一步学习了javaweb的知识

RNN

一.RNN介绍在学习LSTM之前,得先学习RNN。RNN实际上就是一个带有记忆的时间序列的预测模型。RNN的基本结构包括输入层、隐藏层和输出层。在RNN中,输入序列被分成多个时间步,每一个时间步都对应于序列中的一个元素。每个时间步更新一个隐藏状态(Hidden State),该状态不仅接…

每日练习 25.2.7

Guess the K-th Zero (Hard version) 题目 这是一个交互问题。 这是问题的困难版本。与简单版不同的是,在困难版中,查询次数为 \(1 \le t \le \min(n, 10^4)\),查询总数限制为 \(6 \cdot 10^4\)。 波利卡普正在玩一个电脑游戏。在这个游戏中,一个由 \(0\) 和 \(1\) 组成的数…

树上邻域理论(树上圆理论) 小记

邻域:记 \(f(u, r)\) 表示距离 \(u\) 不超过 \(r\) 的点组成的邻域。令 \(x, y\) 为点集 \(S\) 中两个距离最远的点,设 \(u\) 为 \(x, y\) 中点(可能是一条边的中心),设 \(d\) 为 \(x, y\) 的距离,那么覆盖 \(S\) 的最小邻域为 \(f(u, \frac d2)\)。邻域 \(f(u_1, r_1)\)…

Docker搭建Jenkins并共用宿主机Docker部署服务(一)搭建Jenkins及插件配置 -转载

前言 公司项目多忙着开发,所有项目服务都是博主一个个部署的,时间久了也是心累,所以抽时间把Jenkins部署上,之后让其他开发人员自己部署(让我解脱吧!!)。 部署Jenkins容器 Docker安装就不在赘述了,可以看我之前的文章(懒了);直接开始拉取jenkins镜像。 拉取镜像 docker…

Adam优化器、其与策略梯度法结合

一.Adam优化器旨在根据历史梯度信息来调整每个参数的学习率,从而实现更高效的网络训练。Adam算法的核心思想是同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于0。Adam优化器是一种梯度下降…

ES6-3 Babel转码器

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着你可以用ES6的方式编写程序,又不用担心现有的环境是否支持浏览器支持性查看:https://caniuse.com/Babel官网:https://babeljs.io/ 1、转码示例原始代码用了箭头函数,Babel将…

c++专题三

C++专题三学习日记 stack(栈) 仅支持查询或删除最后一个加入的元素(栈顶元素)函数名 功能 时间复杂度top() 返回栈顶元素 O(1)empty() 判断是否为空 O(1)size() 返回元素个数 O(1)push() 在栈顶插入元素 O(1)pop() 删除栈顶元素 O(1)queue(队列) 仅支持查询或删除第一个加入的…