【第八届蓝桥杯真题】【省赛】【C++B组】【学习笔记】蓝桥杯每日一天day7

同样这里的A、B、C、D都是人为,手动加上的

这7天受益匪浅

周末来了开摆了

A、购物单(5分)

购物单 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

****     180.90       88折
****      10.25       65折
****      56.14        9折
****     104.65        9折
****     100.30       88折
****     297.15        半价
****      26.75       65折
****     130.62        半价
****     240.28       58折
****     270.62        8折
****     115.87       88折
****     247.34       95折
****      73.21        9折
****     101.00        半价
****      79.54        半价
****     278.44        7折
****     199.26        半价
****      12.97        9折
****     166.30       78折
****     125.50       58折
****      84.98        9折
****     113.35       68折
****     166.57        半价
****      42.56        9折
****      81.90       95折
****     131.78        8折
****     255.89       78折
****     109.17        9折
****     146.69       68折
****     139.33       65折
****     141.16       78折
****     154.74        8折
****      59.42        8折
****      85.44       68折
****     293.70       88折
****     261.79       65折
****      11.30       88折
****     268.27       58折
****     128.29       88折
****     251.03        8折
****     208.39       75折
****     128.88       75折
****      62.06        9折
****     225.87       75折
****      12.89       75折
****      34.28       75折
****      62.16       58折
****     129.12        半价
****     218.37        半价
****     289.69        8折

捏麻麻的,直接算就行

#include <iostream>
using namespace std;
int main()
{
    // 请在此输入您的代码
    double price = 180.90*0.88+10.25*0.65+56.14*0.9+104.65*0.9+100.3*0.88+297.15*0.5+26.75*0.65+130.62*0.5  
        +240.28*0.58+270.62*0.8+115.87*0.88+247.34*0.95+73.21*0.9+101*0.5+79.54*0.5+278.44*0.7+199.26*0.5  
        +12.97*0.9+166.30*0.78+125.50*0.58+84.98*0.9+113.35*0.68+166.57*0.5+42.56*0.9+81.90*0.95  
        +131.78*0.8+255.89*0.78+109.17*0.9+146.69*0.68+139.33*0.65+141.16*0.78+154.74*0.8+59.42*0.8  
        +85.44*0.68+293.70*0.88+261.79*0.65+11.30*0.88+268.27*0.58+128.29*0.88+251.03*0.8+208.39*0.75  
        +128.88*0.75+62.06*0.9+225.87*0.75+12.89*0.75+34.28*0.75+62.16*0.58+129.12*0.5+218.37*0.5+289.69*0.8; 
    cout<<((int)price/100 + 1 )* 100<<endl;
    return 0;
}

B、等差素数列(7分)

等差素数列 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

别想玩花里胡哨的,直接暴力就完事咯

#include<iostream>
using namespace std;
bool isPrime(int x)
{
    for(int i = 2 ; i <= x / i ;i++)
      if( x % i == 0 ) return false;
    return true;
}
int main()
{
    int sum=1;
    
    for(int i = 2 ; i < 10000 ;i++)
    if(isPrime(i))
    {
      for(int d = 1 ; d < 10000 ; d++)
        for(int h = 1 ; h <= 10 ;h++)
        {
          int a = i + d * h;
          if(isPrime(a)) sum++; 
          else 
          {
            sum = 1;
            break;
          }  
          if(sum == 10)
          {
            cout<<k<<endl;
            return 0;
          }    
      }
    }
    return 0;
}

C、 承压计算 (13分)

承压计算 - 蓝桥云课 (lanqiao.cn)

X 星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。 金属材料被严格地堆放成金字塔形。

                             7 
                            5 8 
                           7 8 8 
                          9 2 7 2 
                         8 1 4 9 1 
                        8 1 8 8 4 1 
                       7 9 6 1 4 5 4 
                      5 6 5 5 6 9 5 6 
                     5 5 4 7 9 3 5 5 1 
                    7 5 7 9 7 4 7 3 3 1 
                   4 6 4 5 5 8 8 3 2 4 3 
                  1 1 3 3 1 6 6 5 5 4 4 2 
                 9 9 9 2 1 9 1 9 2 9 5 7 9 
                4 3 3 7 7 9 3 6 1 3 8 8 3 7 
               3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
              8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
             8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
            2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
           7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
          9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
         5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
        6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
       2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
      7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
     1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
    2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 
   7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 
  7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 
 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1 
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 

其中的数字代表金属块的重量(计量单位较大)。 最下一层的 X 代表 30 台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上, 最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。

电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:2086458231

请你推算出:读数最大的电子秤的示数为多少?

我觉得这题用,文件读写来说,会更简单,还有这题是求比例,真的是坑

#include <bits/stdc++.h>
using namespace std;
const int N = 31;
double f[N][N];
double a[N][N] = {{0},{
0,7},{
0,5,8},{
0,7,8,8},{
0,9,2,7,2},{
0,8,1,4,9,1},{
0,8,1,8,8,4,1},{
0,7,9,6,1,4,5,4},{
0,5,6,5,5,6,9,5,6},{
0,5,5,4,7,9,3,5,5,1},{
0,7,5,7,9,7,4,7,3,3,1},{
0,4,6,4,5,5,8,8,3,2,4,3},{
0,1,1,3,3,1,6,6,5,5,4,4,2},{
0,9,9,9,2,1,9,1,9,2,9,5,7,9},{
0,4,3,3,7,7,9,3,6,1,3,8,8,3,7},{
0,3,6,8,1,5,3,9,5,8,3,8,1,8,3,3},{
0,8,3,2,3,3,5,5,8,5,4,2,8,6,7,6,9},{
0,8,1,8,1,8,4,6,2,2,1,7,9,4,2,3,3,4},{
0,2,8,4,2,2,9,9,2,8,3,4,9,6,3,9,4,6,9},{
0,7,9,7,4,9,7,6,6,2,8,9,4,1,8,1,7,2,1,6},{
0,9,2,8,6,4,2,7,9,5,4,1,2,5,1,7,3,9,8,3,3},{
0,5,2,1,6,7,9,3,2,8,9,5,5,6,6,6,2,1,8,7,9,9},{
0,6,7,1,8,8,7,5,3,6,5,4,7,3,4,6,7,8,1,3,2,7,4},{
0,2,2,6,3,5,3,4,9,2,4,5,7,6,6,3,2,7,2,4,8,5,5,4},{
0,7,4,4,5,8,3,3,8,1,8,6,3,2,1,6,2,6,4,6,3,8,2,9,6},{
0,1,2,4,1,3,3,5,3,4,9,6,3,8,6,5,9,1,5,3,2,6,8,8,5,3},{
0,2,2,7,9,3,3,2,8,6,9,8,4,4,9,5,8,2,6,3,4,8,4,9,3,8,8},{
0,7,7,7,9,7,5,2,7,9,2,5,1,9,2,6,5,3,9,3,5,7,3,5,4,2,8,9},{
0,7,7,6,6,8,7,5,5,8,2,4,7,7,4,7,2,6,9,2,1,8,2,9,8,5,7,3,6},{
0,5,9,4,5,5,7,5,5,6,3,5,3,9,5,8,9,5,4,1,2,6,1,4,3,5,3,2,4,1}};
int main(){
    for(int i = 1; i <= 29; i ++)
    {
        for(int j = 1; j <= i;j ++)
        { 
            double t = a[i][j] * 1.0 / 2;
            a[i + 1][j] += t;
            a[i + 1][j + 1] += t; 
        } 
    }
    double mi = 0x3f, ma = 0;
    for(int i = 1 ; i <= 30 ; i ++)
    {
        mi = min(a[30][i] , mi);
        ma = max(ma , a[30][i]);
    } 
    long long p = ma * (2086458231 * 1.0 / mi);
    cout << p << endl;
    return 0;
}

D、 方格切割(17分)

方格分割 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

图片描述图片描述图片描述

DFS,我们这里优雅解决镜像问题

(3,3) 这个点在哪个形状都存在

#include<iostream>
using namespace std;
const int N = 10;
int g[N][N];
int dx[] = {-1,0,1,0} , dy[] = {0,1,0,-1};
int res = 0;
void dfs(int x,int y)
{
  if(x == 0 || x == 6 || y == 0 || y == 6 )
  {
    res ++;
    return;
  }
  for(int i = 0 ; i < 4 ; i++)
  {
    int a = x + dx[i], b = y + dy[i];
    if(g[a][b] == 0)
    {
      g[a][b] = 1;
      g[6-a][6-b] = 1;
      dfs(a,b);
      g[a][b] = 0;
      g[6-a][6-b] = 0;
    }
  }

}
int main()
{
  g[3][3] = 1;
  dfs(3,3);
  cout << res / 4 << endl;
  return 0;
}

E、取位数(9分)

取位数 - 蓝桥云课 (lanqiao.cn)

#include <stdio.h>
// 求x用10进制表示时的数位长度 
int len(int x){
    if(x<10) return 1;
    return len(x/10)+1;
}
    
// 取x的第k位数字
int f(int x, int k){
    if(len(x)-k==0) return x%10;
    return _____________________;  //填空
}
    
int main()
{
    int x = 23574;
    printf("%d\n", f(x,3));
    printf("%d\n", f(893275,2));
}
#include <stdio.h>
// 求x用10进制表示时的数位长度 
int len(int x){
    if(x<10) return 1;
    return len(x/10)+1;
}
    
// 取x的第k位数字
int f(int x, int k){
    if(len(x)-k==0) return x%10;
    return f(x / 10,k);  //填空
}
    
int main()
{
    int x = 23574;
    printf("%d\n", f(x,3));
    printf("%d\n", f(893275,2));
}

F、最大公共子串(11分)

最大公共子串 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

#include <stdio.h>
#include <string.h>

#define N 256
int f(const char* s1, const char* s2)
{
    int a[N][N];
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i,j;
    
    memset(a,0,sizeof(int)*N*N);
    int max = 0;
    for(i=1; i<=len1; i++){
        for(j=1; j<=len2; j++){
            if(s1[i-1]==s2[j-1]) {
                a[i][j] =  a[i-1][j-1] + 1 ;   // 填空
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }
    
    return max;
}

int main()
{
    printf("%d\n", f("abcdkkk", "baabcdadabc"));
    printf("%d\n", f("aaakkkabababa", "baabababcdadabc"));
    printf("%d\n", f("abccbaacbcca", "ccccbbbbbaaaa"));    
    printf("%d\n", f("abcd", "xyz"));
    printf("%d\n", f("ab", "ab"));
    return 0;
}

G、日期问题(19分)

日期问题 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

【输入样例】

02/03/04

【输出样例】

2002-03-04
2004-02-03
2004-03-02

y总,这一手枚举,给我干门比了

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check_valid(int year,int month,int day)
{
    if(month > 12 || month == 0) return false;
    if(day == 0) return false;
    if(month != 2 && day > days[month]) return false;
    if(month == 2)
    {
        int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
        if(day > 28 + leap) return false;
    }
    return true;
}

int main()
{
    int a,b,c;
    scanf("%d/%d/%d",&a,&b,&c); 
    for(int date = 19600101 ; date <= 20591231 ; date++)
    {
        int year = date / 10000,month = date % 10000 / 100,day = date % 100;
        if(check_valid(year,month,day))
        {
            if(year % 100 == a && month == b && day == c  ||    // 年/月/日
               month == a && day == b && year % 100 == c  ||   // 月/日/年
               day == a && month == b && year % 100 == c      // 日/月/年
                )
            printf("%d-%02d-%02d\n",year,month,day);  
        }
    }
    return 0;
}

H、包子凑数(21分)

在这里插入图片描述

【输入样例】

2
4
5

【输出样例】

6

【输入样例】

2
4
6

【输出样例】

INF

【样例解释】

对于样例1,凑不出来的数目包括:1,2,3,6,7,11

对于样例2,所有奇数都凑不出来,所以为INF

这不用DP乱杀,我都对不起我自己

I、 分巧克力(23分)

在这里插入图片描述

【输入样例】

2 10
6 5
5 6

【输出样例】

2
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N],w[N];
int n,k;
bool check(int mid)
{
    int res = 0;
    for(int i = 0 ; i < n ; i++)
    {
        res += (w[i] / mid) * (h[i] / mid);
        if(res >= k) return true;
    }
    return false;
}
int main()
{
    cin>>n>>k;
    for(int i = 0 ; i < n ; i++) cin>>h[i]>>w[i];
    int l = 1 ,r = 1e5;
    while(l < r)
    {
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout<<l<<endl;
    return 0;
}

J、k区间(25分)

在这里插入图片描述

【输入样例】

5 2
1
2
3
4
5

【输出样例】

6

y总的优化,给我看的麻麻的从,真的是考试,还得是暴力🤗

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
LL s[N],cnt[N];
int n,k;
int main()
{
    cin>>n>>k;
    for(int i = 1 ; i <= n ; i++)
    {
        cin>>s[i];
        s[i] += s[i-1];
    }
    LL res = 0;
    cnt[0] = 1;         // s[0] % k == 0 所以在开始之前,就已经有一个数字模k == 0了
    for(int i = 1 ; i <= n ; i++)
    {
        res += cnt[s[i] % k];
        cnt[s[i] % k]++;
    }
    cout<<res<<endl;
    return 0;
}

每日一练

奇数的倍数

在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
  for(int i = 2019 + 2019 ; i <= 1000000 ; i += 2019)
  {
      int t = i;
      bool flag = true;
      while(t)
      {
        if(t % 10 % 2 == 0) 
        {
          flag = false;
          break;
        }
        t /= 10;
      }
      if(flag)
      {
        cout << i << endl;
        return 0;
      }
  }
  return 0;
}
// 139311

第几个幸运数字

在这里插入图片描述

我们可以枚举所有之前的数从 3 0 ∗ 5 0 ∗ 7 0 {3^0*5^0*7^0} 305070 开始枚举, n u m b e r = 3 a ∗ 5 b ∗ 7 c {number = 3^a * 5^b * 7^c} number=3a5b7c

#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
  LL number = 59084709587505;
  LL res = 0;
  for(LL i = 1 ; i <= number ; i *= 3)
    for(LL j = 1 ; j * i <= number ; j *= 5)
      for(LL k = 1 ; i * j * k <= number ; k *= 7)
            res++;
  cout << res - 1 << endl;
  return 0;
}

四平方和

四平方和 - 蓝桥云课 (lanqiao.cn)

在这里插入图片描述

示例

输入

12

输出

0 2 2 2

二分

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5e6 + 10;
struct Sum
{
    int s,c,d;
    bool operator< (const Sum &t)const
    {
        if(s != t.s) return s < t.s;
        if(c != t.c) return c < t.c;
        return d < t.d;
    }
}sum[N];
int n,m;
int main()
{
    cin>>n;
    for(int c = 0 ; c * c <= n ; c++)
        for(int d = c ; c * c + d * d <= n ; d++)
            sum[m++] = {c * c + d * d , c , d};
    sort(sum,sum + m);
    for(int a = 0 ; a * a <= n ; a++)
        for(int b = a ; a * a + b * b <= n ; b++)
        {
            int t = n - a * a - b * b;
            int l = 0 , r = m - 1;
            while(l < r)
            {
                int mid = l + r >> 1;
                if(sum[mid].s >= t) r = mid;
                else l = mid + 1;
            }
            if(sum[l].s == t)
            {
                printf("%d %d %d %d\n",a,b,sum[l].c,sum[r].d);
                return 0;
            }
        }
    return 0;
}

迷宫

在这里插入图片描述

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
int dx[] = {1,0,0,-1}, dy[] = {0,-1,1,0}; 	// D < L < R < U
char items[] = {'D','L','R','U'};
char g[35][55];
bool st[35][55];
int d[35][55];
int n = 30,m = 50;
string ans;
void bfs()
{
	queue<PII> q;
	memset(d,-1,sizeof d);
	d[30][50] = 0;
	q.push({30,50});
	while(!q.empty())
	{
		auto t = q.front();
		q.pop();
		for(int i = 0 ; i < 4 ; i++)
		{
			int a = t.first + dx[i], b = t.second + dy[i];
			if(a > 0 && a <= m && b > 0 && b <= m && g[a][b] == '0' && d[a][b] == -1)
			{
				d[a][b] = d[t.first][t.second] + 1;
				q.push({a,b});
			}
		}
	}
}
int main()
{
  for(int i = 1 ; i <= n ; i++)
  	for(int j = 1 ; j <= m ; j++)
	  	cin >> g[i][j];

  bfs();
  // 存答案
  int x = 1, y = 1;
  while(x != 30 || y != 50)
  {
      for(int i = 0 ; i < 4 ; i++)
      {
        int a = x + dx[i],b = y + dy[i];
        if(a > 0 && a <= 50 && b > 0 && b <= 50 && g[a][b] == '0' && d[a][b] == d[x][y] -1 )
        {
          x = a , y = b;
          ans += items[i];
          break;
        }
      }

  }
  cout << ans << endl;
  return 0;
}

周末开始了,👴runrun了,

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值