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;
}