蓝桥杯编程题讲解

给定一个正整数 N ,然后将 N 分解成 3 个正整数之和。

计算出共有多少种符合要求的分解方法。

要求:

分解的 3 3 3个正整数各不相同;

分解的 3 3 3个正整数中都不含数字3和7.

如:N为8,可分解为 ( 1 , 1 , 6 ) (1,1,6) (1,1,6)、 ( 1 , 2 , 5 ) (1,2,5) (1,2,5)、 ( 1 , 3 , 4 ) (1,3,4) (1,3,4)、 ( 2 , 2 , 4 ) (2,2,4) (2,2,4)、 ( 2 , 3 , 3 ) (2,3,3) (2,3,3),其中满足要求的分解方法有 1 1 1种,为 ( 1 , 2 , 5 ) (1,2,5) (1,2,5)。

输入描述

输入一个正整数 N ( 5 < N < 501 ) N (5<N<501) N(5<N<501),表示需要分解的正整数。

输出描述

输出一个整数,表示共有多少种符合要求的分解方法。

用例输入 1

8

用例输出 1

1

解答:

这道题算出三个数判断就行

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
bool check(int x)//这个函数用来判断x是否含有7或3
{
    while(x!=0)
    {
        if(x%10==3||x%10==7) return 0;
        x=x/10;
    }
    return 1;
}
int main() 
{
	int n,cnt=0;
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        for(int j=i+1;j<=n-1;j++)
        {
        	int k=n-i-j;//算出第三个数
        	if(k<=j||check(i)==0||check(j)==0||check(k)==0) continue;
            cnt++;
        }
    }
    cout<<cnt;
  return 0;
}

数池塘(四方向)

题目描述

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N × M ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) N\times M(1\leq N\leq 100, 1\leq M\leq 100) N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。

输入第 1 1 1 行:两个空格隔开的整数: N N N 和 M M M。

第 2 2 2 行到第 N + 1 N+1 N+1 行:每行 M M M 个字符,每个字符是 W.,它们表示网格图中的一排。字符之间没有空格。

输出一行,表示水坑的数量。

样例输入 #1

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出 #1

3

这道题用广度优先遍历

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
char g[110][110];
int dx[]={-1,0,1,0},
	dy[]={0,-1,0,1},n,m,cnt;//偏移数组
void bfs(int x,int y)
{
    queue<PII> q;
    q.push({x,y});
    g[x][y]='.';
    while(q.size()!=0)
    {
        PII p=q.front();q.pop();
        x=p.first,y=p.second;
        for(int i=0;i<4;i++)
        {
            int a=dx[i]+x,b=dy[i]+y;
            if(a<1||a>n||b<1||b>m) continue;//检查有没有越界
            if(g[a][b]=='.') continue;
            q.push({a,b});
            g[a][b]='.';
        }
    }
}
int main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>g[i][j];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]=='W')
            {
                cnt++;
                bfs(i,j);
            }
        }
    }
    cout<<cnt;
 	return 0;
}

手工课上老师拿出 N N N 张长方形彩纸,且每张彩纸上都画着 W × H W\times H W×H 的网格(网格铺满整张彩纸)。现在老师将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形,并且要使裁剪出的正方形的边长最大(裁剪的正方形边长必须为整数)。

例如: N = 2 N=2 N=2,有 2 2 2 张彩纸,第一张彩纸 W = 4 W=4 W=4, H = 3 H=3 H=3,第二张彩纸 W = 5 W=5 W=5, H = 4 H=4 H=4; K = 6 K=6 K=6,裁剪的 6 6 6 个正方形边长最大是 2 2 2。

当给出 N N N 张长方形彩纸 W W W 和 H H H,及 K K K 的值,请计算出将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形,正方形的边长最大是多少(裁剪的正方形边长必须为整数)。

输入描述

第一行输入两个正整数 N N N, K ( 1 < N < 100 , 1 < K < 100 ) K (1<N<100,1<K<100) K(1<N<100,1<K<100), N N N 表示彩纸数量, K K K 表示需裁剪的正方形数量,两个正整数之间一个空格隔开;

第二行开始,输入 N N N 行,每行输入两个正整数 W W W 和 H H H, ( 1 < W < 1000 , 1 < H < 1000 ) (1<W <1000,1<H <1000) (1<W<1000,1<H<1000)

表示彩纸的宽度,两个正整数之间一个空格隔开。

输出描述

输出一个正整数,表示将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形的边长最大是多少(裁剪的正方形边长必须为整数),如果不能裁剪出 K K K 张正方形就输出-1。

输入
2 6
4 3
5 4
输出
2

解答:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int a[110],b[110],n,k;
int f(int g)
{
  int sum=0;
  for(int i=1;i<=n;i++)
  {
  	sum+=(a[i]/g)*(b[i]/g);
  }
  return sum;
}
int main() 
{
  int	x=0;
  cin>>n>>k;
  for(int i=1;i<=n;i++)
  {
      cin>>a[i]>>b[i];
      x=max(x,max(a[i],b[i]));//把这三个数打擂台
  }
  for(int i=x;i>=1;i--) if(f(i)>=k) {cout<<i;return 0;}
  cout<<-1;
  return 0;
}
相关推荐
算法歌者13 分钟前
[算法]入门1.矩阵转置
算法
林开落L28 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色29 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download31 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
Prejudices41 分钟前
C++如何调用Python脚本
开发语言·c++·python
单音GG44 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
SoraLuna1 小时前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷1 小时前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿1 小时前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
qing_0406031 小时前
C++——多态
开发语言·c++·多态