HDU 4814

题目的大意就是用(1+√5)/2进制来表示十进制中的数。

做法就是一个模拟,a[]数组表示答案,其中第50位表示个位,后面的是小数位。
利用题目给的两个公式,进行一系列进位等操作。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 110

int a[maxn];

int main()
{
    //freopen("out(2).txt", "w", stdout);
    int n;
    while(scanf("%d", &n) != EOF)
    {
        if(n == 1)
        {
            printf("1\n");
            continue;
        }
        memset(a, 0, sizeof(a));
        a[50] = n;
        int f = 1;
        while(f)
        {
            f = 0;
            for(int i = 100; i >= 0; i--)
            {
                if(a[i] > 1)
                {
                    f = 1;
                    int t = a[i] / 2;
                    a[i] -= t * 2;
                    a[i-1] += t;
                    a[i+2] += t;
                }
            }
            for(int i = 100; i >= 0; i--)
            {
                if(a[i+1] && a[i+2])
                {
                    f = 1;
                    int t = min(a[i+1], a[i+2]);
                    a[i+1] -= t;
                    a[i+2] -= t;
                    a[i] += t;
                }
            }
        }
        f = 0;
        int f1 = 0;
        for(int i = 0; i <= 50; i++)
        {
            if(a[i] == 0)
            {
                if(f)
                printf("0");
            }
            else
            {
                printf("1");
                f = 1;
            }
        }
        if(f == 0)
        printf("0");
        f = 0;
        for(int i = 51; i < 100; i++)
        {
            if(a[i] == 0)
            f++;
            else
            {
                if(!f1)
                {
                    f1 =1;
                     printf(".");
                }

                for(int j = 0; j < f; j++)
                printf("0");
                printf("1");
                f = 0;
            }
        }
        cout << endl;
    }
}

  但是奇怪的是,当我调换了循环的顺序,从前向后循环就会出现一个错误的结果,很是不解。

时间: 2024-09-30 16:32:33

HDU 4814的相关文章

HDU - 4814 Golden Radio Base (长春赛区B题)

最小二乘法又叫做最小平方法,是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配. 通常情况下最小二乘法用于求回归问题.以简单的线性最小二乘为例,二维平面上给定个点的坐标,确定一条直线, 要求大致符合这个点的走向. 我们可以设这条直线的方程为,那么就要使在处的函数值与给定的值相 差达到最小,也就是说,要确定的值,使得 最小.根据这种方法求的值就是典型的最小二乘法. 可以看出是的一个二元函数,要求的最小值,那么求偏导,有 进一步得到 然后联立两式可以解出,如果方程数比较多,我们可以用

HDU 4814 Golden Radio Base 小模拟

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题意:黄金比例切割点是,如今要求把一个10进制的的数转化成一个phi进制的数,而且不能出现'11'的情况. 思路:因为题目中给出了两个式子,题目就变成了一道简单的模拟题了.因为整个phi进制的数最多仅仅有200,而数据中最多仅仅有100位,所以从aa[50]=tot 開始模拟就可以. 代码: #include<iostream> #include<cstdio> #include&l

HDU 4814 Golden Radio Base 模拟

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题目大意: 把一个正整数表示为φ进制, φ = (1+√5)/2 . 且已知: 1. φ + 1 = φ 2 ,所以有11(φ) = 100(φ),且要求11要转变为100 2. 2 * φ 2  = φ3 + 1 . 解题思路: 观察发现,2 = 10.01.所以对于一个数N,能够从N/2 推导得到,是一个模拟的过程.我比赛的时候居然用了高速幂... 代码: #include<cstdio>

HDU 4814 Golden Radio Base

很显然是个进制转换的题,根据题意有a^2 = a + 1  -> a^n = a^(n-1) + a^(n-2),这样就能消除两个连续1. 另,a^3 = a^2 + 1 = 2*a+2 = 2*(a+1)  =  2*a.这样就可以将悉数转化为01. 10^9大约是2^30,所以总长度不超高150,直接模拟就好了. #include <algorithm> #include <iostream> #include <cstring> #include <c

hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19465    Accepted Submission(s): 4814 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿

HDU 1711 Number Sequence(字符串匹配)

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10571    Accepted Submission(s): 4814 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1],

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往