蓝桥杯 ADV-327 VIP试题 研究兔子的土豪(试题解析)
试题 算法提高 研究兔子的土豪
提交此题 评测记录
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
某天,HWD老师开始研究兔子,因为他是个土豪
,所以他居然一下子买了一个可以容纳10^18代兔子的巨大笼子(好像比我们伟大的地球母亲大一点点?),并开始研究它们,之后,他了解了兔子的繁衍规律:即fibonacci数列。
兔子繁殖了n代后,HWD老师很开心。
但是,HWD老师有密集恐惧症,所以,他只能去卖了兔子,他找到了一个好的雇主,但是这个雇主有强迫症,他只每次收购1007只兔子,HWD老师为了避免自己的密集恐惧症,要尽量多的卖了兔子。
但是即便是密集恐惧症,也打击不了HWD老师研究兔子的决心,他数着数着自己剩下的兔子……
输入格式
HWD老师让兔子繁衍了几代(一个整数,没有其他字符)。
输出格式
HWD老师剩余(残余?)的兔子(一个整数,忽略行尾回车及空格)。
样例输入
1
样例输出
1
数据规模和约定
兔子的总量最大时小于HWD老师笼子的大小。
f[1]=1,f[2]=1,f[3]=2 ……
解题思路:/*难点一:高精度算法求斐波那契数列 ;难点二:最后的兔子总量里面究竟有多少整数个1007可以减去。
难点一,我的解决办法是用f0,f1,f2,三个向量,其中f2表示当前第i代兔子总量,f1表示当前第(i-1)代兔子总量,f0表示当前第(i-2)代兔子总量,每次繁衍前,上一次f2清空,随后f2=f0+f1,得到f2后,向后更新f0=f1、f1=f2。
难点二,我的解法是最后得到f2,然后用f2不断减去1007,直到f2<1007为止,然而,这个算法跑了30分, 碰到n>100就超时了。*/思索再三,我想到,正解应该是在每次繁衍后能减就减去1007。未完待续。。。
二更:啊2333,我一开始就想复杂了,完全可以用long long表示数列元素,同样f2=f0+f1(f2%=1007),然后在更新f0、f1,如此循环,跑了50分,最后还是逃不了超时。。。
original代码如下:
#include <iostream>
#include <vector>
#include <sstream>
#include <cmath>
using namespace std;
vector<long long > f0;
vector<long long > f1;
vector<long long > f2;
long long n;
void updateF2(){
for(int i=0;i<f2.size();i++){
if(f2[i]>=10){
if(i<f2.size()-1)//i不是最高位下标
f2[i+1]+=f2[i]/10;
else
f2.push_back(f2[i]/10);
f2[i]%=10;
}
if(f2[i]<0){
f2[i]+=10;
f2[i+1]--;
}
}
for(int i=f2.size()-1;i>=0;i--){
if(f2[i]==0)
f2.pop_back();
else
break;
}
}
void Print(){
for(int i=f2.size()-1;i>=0;i--){
cout<<f2[i];
}
cout<<endl;
}
void getF2(){
f2.clear();
long long p0=0,p1=0;
while((p0<=f0.size()-1) && (p1<=f1.size()-1) ){
f2.push_back(f0[p0++]+f1[p1++]);
}
if(p0<=f0.size()-1){
f2.push_back(f0[p0++]);
}
if(p1<=f1.size()-1){
f2.push_back(f1[p1++]);
}
updateF2();
//f2=f0+f1后, 更新f0=f1, f1=f2
f0.clear();
for(int i=0;i<f1.size();i++){
f0.push_back(f1[i]);
}
f1.clear();
for(int i=0;i<f2.size();i++){
f1.push_back(f2[i]);
}
}
long long getCurNum(){
long long num=0;
int cnt=f2.size()-1;
for(int i=f2.size()-1;i>=0;i--){
num+=f2[i]*pow(10,cnt--);
}
return num;
}
void massiveMinus(){
// cout<<"start to massiveMinus"<<endl;
while(f2.size()>=11){
f2[6]-=7;
f2[9]-=1;
updateF2();
// cout<<"in >=11"<<endl;
}
while(f2.size()>=10){
f2[5]-=7;
f2[8]-=1;
updateF2();
// cout<<"in >=10"<<endl;
}
// cout<<"after 6"<<endl;
while(f2.size()>=9){
f2[4]-=7;
f2[7]-=1;
updateF2();
}
// cout<<"after 5"<<endl;
while(f2.size()>=8){
f2[3]-=7;
f2[6]-=1;
updateF2();
}
// cout<<"after 4"<<endl;
while(f2.size()>=7){
f2[2]-=7;
f2[5]-=1;
updateF2();
}
// cout<<"after 3"<<endl;
while(f2.size()>=6){
f2[1]-=7;
f2[4]-=1;
updateF2();
}
// cout<<"after 2"<<endl;
while(f2.size()>=5){
f2[0]-=7;
f2[3]-=1;
updateF2();
}
// cout<<"after 1"<<endl;
if(f2.size()<=4){
long long num=0;
while(1){
if(getCurNum()<1007){
num=getCurNum();
break;
}
f2[0]-=7;
f2[3]-=1;
updateF2();
}
cout<<num<<endl;
}
}
int main(int argc, char** argv) {
cin>>n;
f0.push_back(1);
f1.push_back(1);
for(int i=3;i<=n;i++){
getF2();
}
if(n<17){//直接输出f2
if(n<=2)
cout<<"1"<<endl;
else
Print();
}
else{//f2减去1007*(f2/1007),在输出
// cout<<"先打印f2"<<endl;
// Print();
massiveMinus();
}
// long long a=1007;
// cout<<1007*100000<<endl;
return 0;
}
二更代码如下:
#include <iostream>
using namespace std;
long long n;
long long f0,f1,f2;
void getF2(){
f2=f0+f1;
if(f2>1007){
f2%=1007;
}
f0=f1;
f1=f2;
}
int main(int argc, char** argv) {
f0=1,f1=1;
cin>>n;
if(n<3){
cout<<"1"<<endl;
}
else{
for(long long i=3;i<=n;i++){
getF2();
}
cout<<f2<<endl;
}
return 0;
}
蓝桥杯 ADV-327 VIP试题 研究兔子的土豪(试题解析)相关推荐
- Java实现 蓝桥杯VIP 算法提高 研究兔子的土豪
试题 算法提高 研究兔子的土豪 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 某天,HWD老师开始研究兔子,因为他是个土豪 ,所以他居然一下子买了一个可以容纳10^18代兔子的巨大 ...
- 蓝桥杯 算法提高 研究兔子的土豪 C语言
研究兔子的土豪 问题描述 某天,HWD老师开始研究兔子,因为他是个土豪 ,所以他居然一下子买了一个可以容纳10^18代兔子的巨大笼子(好像比我们伟大的地球母亲大一点点?),并开始研究它们,之后,他了解 ...
- c语言oj题1923偶数之和,问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 (BFS)
题目描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...
- [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索
题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...
- [蓝桥杯][算法提高VIP]夺宝奇兵-dp
题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...
- 2022年第十三届蓝桥杯大赛软件省赛Java学B组试题
第十三届蓝桥杯大赛软件省赛Java学B组试题 一.试题截图 1. 星期计算 这道题是可以直接用笔算起来的,我算出来的答案是5,(2022整除7 余6,六天后就是星期五)但目前官方答案还不知道是什么? ...
- 蓝桥杯 基础练习VIP FJ的字符串 java
蓝桥杯 基础练习VIP FJ的字符串 java 题目 题目描述 FJ在沙盘上写了这样一些字符串: A1 = "A" A2 = "ABA" A3 = " ...
- [蓝桥杯][算法提高VIP]阮小二买彩票
[蓝桥杯][算法提高VIP]阮小二买彩票 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下 ...
- [蓝桥杯][算法提高VIP]阮小二买彩票[递归全排列]
题目 1578: [蓝桥杯][算法提高VIP]阮小二买彩票 时间限制: 1Sec 内存限制: 128MB 提交: 348 解决: 153 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都 ...
最新文章
- Android应用程序键盘(Keyboard)消息处理机制分析(8)
- 集群中几种session同步解决方案的比较[转]
- vc 获取月份的天数_「青少年编程」课程:输入年份与月份,得到该月有多少天...
- python扫描内网banner信息
- 有关链表的小技巧,我都给你总结好了
- 聊一聊SpringCloudNetflix的五大组件(神兽)
- 什么是股票的发行价和市价
- 对DNN的一些高层架构设想
- InstallShield 2012 Spring新功能试用(6): InstallScript工程支持64位组件(Components)...
- git与gitk查看某个文件的历史提交记录
- 进程间通信-----管道
- 如何连接linux服务器
- 浅谈两轮平衡车的控制原理(续)
- 二、ArcGIS中shp裁剪dem
- 服务器部署dble全流程
- 惠普HP Designjet Z5200 PostScript 打印机驱动
- MYSQL数据库版本更新
- 概率图几种模型的简介和比较
- Java基础:01Java语言概述(常见的DOS命令,Java语言的特点、核心机制、环境搭建,HelloWorld,注释,Java API 文档)
- 视频教程-拼多多返利系统二-Java