• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > C++一直超时,如何优化

C++一直超时,如何优化

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了c++超时,c++读入优化,c++ o2优化,c++,c++视频课程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:C++一直超时,如何优化
描述:

#include<iostream>
using namespace std;
double fib(int n) ; 
int main()
{
    int n;
    cin>>n;
    double a[20000];
    for(int i=0;i<n;i++)cin>>a[i];
    double b[20000];
    for(int j=0;j<n;j++){
    for(int i=0;i<100003;i++)
    {
        if(fib(i)>a[j]){
            b[j]=fib(i-1);
            break;
        }
    }}
    for(int i=0;i<n;i++)
        cout<<b[i]<<endl;
    return 0;
    
}
double fib(int n)  
{  
    int result[2] = {0,1};  
    if(n < 2)  
        return result[n];  
    double fibOne = 0;  
    double fibTwo = 1;  
    double fibN   = 0;  
    int i = 0;  
    for(i = 2; i <= n; i++)  
    {  
        fibN = fibOne + fibTwo;  
          
        fibOne = fibTwo;  
        fibTwo = fibN;  
    }  
      
    return fibN;  
}  

如何瘦脸,如何截图,如何减肥,如何接吻,如何刷机,如何盗号,如何做蛋糕,如何赚钱,如何理财,如何评课,如何去黑头,如何化妆,如何炒股,如何祛斑,如何变


解决方案1:

你用了int,而int最大只能到2^31 - 1
于是遇到些奇怪的m值的话,你算出来的fib会不断溢出成负数,然后死循环。

既然1 <= n <= 20000,你先把它们全算出来,硬编进源码里,要用时二分搜索就行了。
(楼上那些constexpr之类的高级技巧,本质上也是这样干,不过是由编译器在编译时代劳了……)

当然,再进阶一点的话,你可以用n = log(m * sqrt(5)) / log((sqrt(5) + 1) / 2)作为搜索起点。
因为fib(n) = round(((sqrt(5) + 1) / 2)^m / sqrt(5))

但其实上面这些都没甚么意义,因为fib(48) = 4,807,526,976,已经比2^32大了。
所以其实你只需要unsigned int[48],根本不需要20000位。
你甚至可以硬编码出一堆if else来做这题……

解决方案2:

你用double干什么 double是浮点数
浮点运算慢啊

长的整型用long long

解决方案3:

c++14可以用constexpr + array + index_sequence直接生成fib数组,然后用lower_bound查询就行了。

#include <iostream>
#include <algorithm>
#include <array>
#include <type_traits>
#include <iterator>
#include <utility>

using namespace std;

constexpr uint64_t fib(size_t n) noexcept
{
  if (n < 2)
    return n;
  return fib(n - 1) + fib(n - 2);
}

template<typename F, size_t ... I>
constexpr auto make_array(F&& f, index_sequence<I...>) noexcept
{
  return array<result_of_t<F(size_t)>, sizeof...(I)>{
    f(I)...
  };
}

constexpr auto fib_arr = make_array(fib, make_index_sequence<94>());

int main()
{
  transform(istream_iterator<size_t>(cin), istream_iterator<size_t>(), ostream_iterator<size_t>(cout, "\r\n"), [&](auto v) {
    auto i = lower_bound(begin(fib_arr), end(fib_arr), v);
    return *i == v? v: i != fib_arr.begin()? *(i - 1): fib_arr.back();
  });

  return 0;
}

解决方案4:

楼上都是瞎说 这题其实考的是二分搜索hehe~

--------------分割线--------
作为一个后端的nodejs新手 我决定用lua来实现给你看

local MAX = 48 -- 我是渣渣看错2^32 和10^32次了
local MIN = 1

local fib = {}
fib[1] = 1
fib[2] = 1
local i
for i=3, MAX do
    fib[i] = fib[i-1] + fib[i-2]
end

function fibFloor(x, max, min)
    if max == min+1 then
        return fib[min]
    else
        local mid = math.floor((max+min)/2)
        if (fib[mid] > x) then
            return fibFloor(x, mid, min)
        elseif (fib[mid] == x) then
            return fib[mid]
        else --if (fib[mid] < x) then
            return fibFloor(x, max, mid)
        end
    end
end

local n = io.read("*num")
for i=1, n do
    local x = io.read("*num")
    print(fibFloor(x, MAX, MIN))
end

看了楼下答案以后默默把MAX改成48...

解决方案5:

如果你问的是c++,我觉得优化的余地大概是把cin,cout换成scanf,printf,或者用模板在编译期完成计算。

但是这题显然要的是语言层面以外的优化,方法就是楼上说的矩阵快速幂,不过sicp上还有一个看起来很玄学的fibonacci算法,有兴趣可以看看:-)

解决方案6:

应该是矩阵+快速幂!


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++一直超时,如何优化

相关文章

  • 2017-06-07 Vagrant如何调整虚拟机的内存大小?
  • 2017-06-07 WIN2003帝国CMS现在换到Centos七牛存储插件没有反应!
  • 2017-06-07 python模拟登陆知乎遇到的forbidden问题?
  • 2017-06-07 七牛上的图片全部都访问不了!!!
  • 2017-06-07 从1,3,5,7,9,11,13,15中选3个数(选择可重复)作和得30
  • 2017-06-07 (redis)日志收集探讨
  • 2017-06-07 (python)学习flaskweb开发第四章validate_on_submit遇到错误,没有属性
  • 2017-06-07 (python)当装饰器遇到multiprocessing,出了点bug
  • 2017-06-07 Base64图片转成了base64,这样可以上传到七牛吗
  • 2017-06-07 大神请看超级奇葩问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • python打印列表问题
    • mac安装win7mac安装python_MySQLdb
    • HIbernate多对多映射问题
    • python爬虫python中列表内能否套字典?
    • egit已有项目从github迁移到git@osc?
    • (golang)Go中,除了使用缓存池,如何减少slice的动态分配?
    • 如何高效地做到大文本去除重复行
    • python多线程关于python的多重继承问题
    • 请问seam的自动跳转怎么做?
    • 如何一行代码弄崩你的程序?我先来一发

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有