P1255 数楼梯

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值