埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛F题 1+2=3?

题目链接:https://www.nowcoder.com/acm/contest/91/F

题意:求第N个符合条件X^2X=3X的X。N<=10的12次方。

解题思路:我刚开始想到最粗暴的方法就是打表,但是因为数据量太大就死在了存储问题上,10的12次方个数据无法用数组存储。后经高人指点,知道了对于数据量很大的问题一般都不能存储,需要找规律,通过其他方法来解决。所以这个问题的正确解决思路就是打表找规律,于是乎找到了a[i]=a[i-1]+a[i-2];a[i]表示i及i位以前符合条件的个数。

#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
LL a[65];
LL n,sum;
int main()
{
    a[0]=a[1]=1;
    for(int i=2;i<=64;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }
    int t;
    cin>>t;
    while(t--)
   {
        cin>>n;
        sum=0;
        while(n>0)
        {
            int ard = upper_bound(a+1,a+64,n)-a-1;//upper_bound(a+1,a+64,n)查找n介于它和他前一个数据之间
            n -= a[ard];
            sum += 1LL <<(ard-1);//确定第ard位为1
        }
        cout<<sum<<endl;
    }
}

阅读更多
个人分类: acm水题大作战
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭