蓝桥杯刷题C-最小砝码、灌溉(第十七天2023.1.6)

1、最小砝码:一开始我是完全没什么思路,我是想着把数字找出来,但是也不知道怎么找,后面看别人的思路,看到有个推出了的公式,一开始也是不太懂的,后面自己思考了,想着自己推一个公式出来。不就是看想要求的砝码重量至少要几个砝码才能求出来吗,何不如先求出几个砝码最大范围能求出哪些重量砝码,如此找出以下规律:

           n            N                     需要的砝码重量
           1            1                             1
           2          2-4                          1、3
           3         5-13                       1、3、9
           4        14-40                     1、3、9、27
          5       41-121                  1、3、9、27、81

然后求每个n能得出的N的范围,找出规律小数x和大数d:

                   n                                 N
                  1                               3^0
                  2                        3^0+1~3^0+3^1
                 3                   3^0+3^1+1~3^0+3^1+3^2
               ……                         ………………

以此得出如下代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

int sz(int a,int b)
{
	int sum=0,i;
	for(i=0;i<=b;i++)
	{
	   sum+=pow(a,i);	
	}
	return sum;
}

int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int N;
  scanf("%d",&N);
  int i,j,n,x=1,d=1;
  if(N==1)
  {
  	printf("%d",x);
  	return 0;
  }
  for(i=1;;i++)
  {
	x=sz(3,i-1)+1;
	d=sz(3,i);
	if(N>=x&&N<=d)
	{
		printf("%d",i+1);
		return 0;
	}
  }
}

2、灌溉:这道题我一开始想着要考虑会在墙壁那里,就会扩少一点,但是后面我发现根本不用担心,只要在加总数的时候,溢出数组的就算不上了,所以可以不用考虑。

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int n,m,t;
   scanf("%d%d%d",&n,&m,&t);
   int a[100][100],b[100][100],i,j,r,c,k,sum=0;
    for(i=1;i<=t;i++)
    {
      scanf("%d%d",&r,&c);
      a[r][c]=1;
      b[r][c]=1;
    }
  scanf("%d",&k);
  while(k>0){
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=m;j++)
      {
        if(a[i][j]==1){
          b[i+1][j]=1;
          b[i-1][j]=1;
          b[i][j-1]=1;
          b[i][j+1]=1;
        }
      }
    }
    k--;
  }
  for(i=1;i<=n;i++)
  {
    for(j=1;j<=m;j++)
    {
      if(b[i][j]==1)
      {
        sum++;
      }
    }
  }
  printf("%d",sum);
  return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值