【2019年蜀山区小学区赛】四题解

1.求和【sum】

描述

斐波拉契数列,又称黄金分割数列,因数学家列昂纳多●斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列",指的是这样一个数列: 1、1、2、3、5、8、13.、21、34、....在数学上,斐波那契数列以如下被以递推的方法定义: F(1)=1, F(2)=1, F(n)=F (n-1)+F(n-2)(n>=3)。

斐波拉契数列的前两项分别为1.1。以后每项为前两项之和。现在输入n,要求斐波拉契数列前n项的和(1<=n<=5000)。

输入

输入只有二个数n,表示求斐波拉契数列前n项的和。

输出

输出斐波拉契数列前n项的和

输入样例 1复制

3

输出样例1复制

4

提示

对于40%的数据,n<=10

对于100%的数据,n<=5000

这一年真的np,第一题就来高精度

#include<bits/stdc++.h>
using namespace std;
string wc(string a,string b){//高精度加高精度
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());//区赛不知道给不给用
	int s=0;
	string ans;
	for(int i=0;i<max(a.size(),b.size());i++){
		if(i<a.size()){
            s+=a[i]-48;
        }    
		if(i<b.size()){
            s+=b[i]-48;
        }
		ans=char(s%10+48)+ans;
		s/=10;
	}
	if(s!=0){
		ans='1'+ans;
    }
	return ans;
}
int main(){
	int n;
	scanf("%d",&n);
	if(n==1||n==2){
		printf("%d",n);
		return 0;
	}
	string f[n+1],ans="2";
	f[1]="1";
	f[2]="1";
	for(int i=3;i<=n;i++){
		f[i]=wc(f[i-1],f[i-2]);
        f[i]=f[i-1]+f[1-2];
		ans=wc(ans,f[i]);
	}
	cout<<ans;
	return 0;
}

2.骑车还是走路【bike】

描述

菲菲的家住在大学校园里。在大学校园里,没有自行车,上课办事会很不方便。但实际上,并非去办任何事情都是骑车快,因为骑车总要找车、开锁、停车、锁车等。这要耽误一些时间。假设找到自行车,开锁并骑上自行车的时间为27秒;停车锁车的时间为23秒;步行每秒行走1.2米,骑车每秒走3.0米。 请判断走不同的距离去办事,是骑车快还是走路快。

输入

输入一行,包含一个整数,表示一次办事要行走的距离,单位为米。

输出

输出一行,如果骑车快,首先输出"Bike", 然后输出骑车比走路快的时间,单位为秒:

如果走路快,首先输出"Walk",然后输出走路比骑车快的时间,单位为秒;

如果一样快,输出一行"All"。(时间四舍五入精确到0.1秒)

输入样例 1复制

120

输出样例1复制

Bike 10.0

提示

一次办事需要行走的距离不超过5000米。

第二题比第一题阳间:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int s;
    double bike,walk;
    cin>>s;
    bike=s/3.0+50;
    walk=s/1.2;
    if(bike==walk){
    	cout<<"All";
	}else if(bike>walk){
		cout<<"Walk"<<" ";
        printf("%.1f",bike-walk);
	}else{
		cout<<"Bike"<<" ";
        printf("%.1f",walk-bike);
	}  
     
   
    return 0;
}

简单的计算,比高精度简单。

3.菲菲的月历【moncal】

描述

虽然已经上学好几年,但是菲菲还是想着“下一次放假是什么时候? "之类的问题,因此,菲菲对月历表非常关注,她总是想着看着“什么时候又放假呢? ",这不,才学习信息学不到一个学期的菲菲就想着只要给定年和月,就能打印出当月的月历表。

输入

输入为一行两个整数,第一个整数是年份year (1900<=year<=2099) , 第二个整数是月份month (1<=month<=12) ,中间用单个空格隔开。

输出

输出为月历表。月历表第一行为星期表头, 如下所示:

Sun Mon Tue Wed Thu Fri Sat

其余各行依次是当月各天的日期,从1月开始到31日(30日或28日) 。

日期数字应与星期表头右对齐,即各位数与星期表头相应缩写的最后一个字母对齐。日期中间用空格分隔出空白。

输入样例 1复制

2019 10

输出样例1复制

Sun Mon Tue Wed Thu Fri Sat
          1   2   3   4   5
  6   7   8   9  10  11  12
 13  14  15  16  17  18  19
 20  21  22  23  24  25  26
 27  28  29  30  31

提示

1900年1月1日是星期一

#include<bits/stdc++.h>
using namespace std;//最逆天的一题
int nian,yue,ts=0,i,day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//打表记录每个月有多少天
string kong[8]={"","    ","        ","            ","                ","                    ","                        ",""};//打表解决最大难题:格式
int cnt[8]={0,1,2,3,4,5,6,0};
int main(){
	cin>>nian>>yue;
	for(i=1900;i<nian;i++){
		if(i%400==0||(i%100!=0&&i%4==0)){
			ts+=366;
		}else{
			ts+=365;
		}
	}
	if(nian%400==0||(nian%100!=0&&nian%4==0)){
		day[2]=29;//处理闰年
	}
	for(i=1;i<yue;i++){
		ts+=day[i];
	}
	ts=ts%7+1;//计算y年m月d日是星期几
	cout<<"Sun Mon Tue Wed Thu Fri Sat"<<endl;
	cout<<kong[ts];
	int num=cnt[ts];
	for(i=1;i<=day[yue];i++){
		if(i<10){
			cout<<"  "<<i;//这题最恶心的是格式,我这题做了二十几遍就为了格式
		}else{
			cout<<" "<<i;
		}
		num++;
		if(num%7==0){
			cout<<endl;
		}else{
			cout<<" ";
		}
	}
	return 0;
	}

4.机器人行走【robot】

描述

近年来,市面上的儿童机器人越来越多,会唱歌、讲故事、人机对话是这些儿童机器人的标配,现在越来越多的机器人已经能在人类的指令下行走、跳舞。小菲菲最近拿到了-个新的新型智能机器人,菲菲的智能机器人可以按照输入的命令进行移动,命令包含E'、'S'、 "W、 'N'四种, 分别对应四个不同的方向,依次为东、南、西、北。执行某个命令时,它会向着对应方向移动一个单位。作为新型机器人,自然不会只单单执行一个命令, 它可以执行命令串。对于输入的命令串,每一秒都会按照命令行动一次。而执行完命令串最后一个命令后,会自动从头开始循环。在0时刻时菲菲将她的机器人放置在了(0,0) 的位置,并且输入了命令串。她想知道T秒后她的机器人所在的位置坐标。

输入

第1行: 一个字符串,表示菲菲输入的命令串,保证至少有1个命令;

第2行: 一个正整数T

输出

第1行:两个整数,表示T秒时,菲菲机器人的坐标。

输入样例 1复制

NSWWNSNEEWN
12

输出样例1复制

-1 3

提示

对于60%的数据: T<=500000且命令串长度<=5000

对于100%的数据: T<=2000000000且命令串长度<=5000

向东移动,坐标改变改变为(X+1, Y) ;向南移动,坐标改变改变为(X, Y-1) ;

向西移动,坐标改变改变为(X-1, Y) ;向北移动,坐标改变改变为(X, Y+1).

这题你看T的范围就知道必须优化算法

TLE代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
    string co;
    int t,i;
    cin>>co>>t;
    int x=0,y=0;
    for(i=0;i<t;i++){
        if(co[i%co.size()]=='E'){
            x+=1;
        }else if(co[i%co.size()]=='S'){
            y-=1;
        }else if(co[i%co.size()]=='W'){
            x-=1;
        }else{
            y+=1;
        }
    }
    cout<<x<<' '<< y;
    return 0;
}

时间复杂度O(T),这题t的范围<=2000000000必定超时

优化算法:

#include<bits/stdc++.h>
using namespace std;
char s[5000];
long long t,ss,k,xx,yy,x,y;
int main(){
	cin>>(s+1);
	ss=strlen(s+1);
	cin>>t;
	k=t/ss;
	t%=ss;
	for(int i=1;i<=ss;i++){
		if(s[i]=='N'){
			y++;
		}
		if(s[i]=='S'){
			y--;
		}
		if(s[i]=='E'){
			x++;
		}
		if(s[i]=='W'){
			x--;
		}
	}
	xx=x*k;
	yy=y*k;
	for(int i=1;i<=t;i++){
		if(s[i]=='N'){
			yy++;
		}
		if(s[i]=='S'){
			yy--;
		}
		if(s[i]=='E'){
			xx++;
		}
		if(s[i]=='W'){
			xx--;
		}
	}
	cout<<xx<<" "<<yy;
	return 0;
}

时间复杂度O(t%ss),极大缩减了时间复杂度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值