2021-01-18
作者:互联网
P1255 数楼梯
题目描述
楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入 #1复制
4
输出 #1复制
5
说明/提示
- 对于 60%60% 的数据,N≤50;
- 对于 100%100% 的数据,N≤5000。
思路
题目很简单,当时看到这题第一眼想到递归去搞,然后tle,打个1到30的表,发现是斐波那契
for循环+高精度过。
AC代码
#include"bits/stdc++.h"
using namespace std;
char x[2001],y[2001],l[2001];
int main()
{
double a=1,b=2,c;
int n,jw=0;
l[2000]=1;//斐波那契第2项
y[2000]=2;//斐波那契第3项
scanf("%d",&n);
if(n==0){
printf("0");
return 0;
}
if(n==1){
printf("1");
return 0;
}
if(n==2){
printf("2");
return 0;
}
for(int i=3;i<=n;i++)//开始计算第n项斐波那契
{
for(int j=2000;j>=600;j--)
{
x[j]=y[j]+l[j]+jw;
jw=0;
if(x[j]>=10)
{
jw=1;
x[j]-=10;
}
}
memcpy(l,y,2001);
memcpy(y,x,2001);
}
int o=600;
while(x[o]==0)o++;
for(int t=o;t<=2000;t++)
x[t]+=48;
printf("%s",x+o);
}
P3392 涂国旗
题目描述
某国法律规定,只要一个由 N×M 个小方块组成的旗帜符合如下规则,就是合法的国旗。(毛熊:阿嚏——)
- 从最上方若干行(至少一行)的格子全部是白色的;
- 接下来若干行(至少一行)的格子全部是蓝色的;
- 剩下的行(至少一行)全部是红色的;
现有一个棋盘状的布,分成了 N行 M列的格子,每个格子是白色蓝色红色之一,小 a 希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。
小a很懒,希望涂最少的格子,使这块布成为一个合法的国旗。
输入格式
第一行是两个整数 N,M。
接下来 N 行是一个矩阵,矩阵的每一个小方块是W
(白),B
(蓝),R
(红)中的一个。
输出格式
一个整数,表示至少需要涂多少块。
输入输出样例
输入 #1复制
4 5
WRWRW
BWRWB
WRWRW
RWBWR
输出 #1复制
11
说明/提示
样例解释
目标状态是:
WWWWW
BBBBB
RRRRR
RRRRR
一共需要改 11 个格子。
数据范围
对于100% 的数据,N,M ≤50。
#思路
暴力枚举出每一种颜色涂不同行所要修改的格子数,然后取最小值。
AC代码
#include"bits/stdc++.h"
using namespace std;
char q[56][56];
int main()
{
int n,m,f1=1,f2=1,f3=1,w,r,b,s=0,ans=10000000;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
w=0;
b=0;
r=0;
for(int j=1;j<=m;j++)
{
cin>>q[i][j];
if(q[i][j]=='W')w++;
else if(q[i][j]=='R')r++;
else b++;
}
q[i][m+1]=w;
q[i][m+2]=b;
q[i][m+3]=r;
}
for(int i=1;i<=n-2;i++)//枚举白色的行数
for(int j=1;j+i<=n-1;j++)//枚举蓝色行数,枚举后剩下的就是红色
{
int o=1;
int g=n-i-j;
s=0;
for(o=1;o<=i;o++)
s+=q[o][m+2]+q[o][m+3];
for(int t=1;t<=j;t++,o++)
s+=q[o][m+1]+q[o][m+3];
for(int t=1;t<=g;t++,o++)
s+=q[o][m+2]+q[o][m+1];
ans=min(ans,s);//取最小值
}
printf("%d",ans);
}
标签:std,01,格子,int,18,jw,++,2001,2021 来源: https://blog.csdn.net/qq_51316118/article/details/112762450