蓝桥杯编程题讲解

给定一个正整数 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
解答:
这道题算出三个数判断就行

#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(1N100,1M100) 的网格图表示。每个网格中有水(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

这道题用广度优先遍历

#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<1001<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<10001<H<1000)
表示彩纸的宽度,两个正整数之间一个空格隔开。

输出描述

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

输入
2 6
4 3
5 4
输出
2

解答:

#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;
}
  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值