zoukankan      html  css  js  c++  java
  • P1028 数的计算

    题目连接

    题面:

    思路:

    拿n = 17举个例子:

    首先 17 肯定是答案之一  , ans = 1;

    第二位可以放 1 ~ 8(构成117 、217 、 317 等等), ans = 1 + 8 = 9:

     

    第三位可以放 1 ~ 4 ,但只能放特定的位置:

      比如我在第三位放 1 ,那么第二位是能是 2 ~ 8 

      比如我在第三位放 3 ,那么第二位是能是 6 ~ 8 

      

    比如我在第四位放 1 ,那么第三位只能是 2 ~ 4 , 满足第三位是 2 ~ 4 的情况有 (8 - 4 + 1) + (8 - 6 + 1) + (8 - 8 + 1) = 9 种 , 所以最后一位为第四位且是1的情况数有 9种 

    所以每次把当前位当成最后一位,算以j结尾的情况数。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn =  1e6 + 10;
    #define ll long long
    #define ios std::ios::sync_with_stdio(false)
    #define int long long
    int num[maxn];
    int nex[maxn];
    signed main()
    {
        ios;
        cin.tie(0);
        int n;
        cin >> n;
        int up = n / 2;
        int ans = 1 + n / 2;
        for(int i = 1 ; i <= n / 2 ; i ++){
            num[i] = 1;
        }
        while(up / 2 >= 1){
            nex[up + 1] = 0;
            for(int i = up ; i >= 1 ; i --){
                nex[i] = nex[i + 1] + num[i];
            }
            for(int i = 1 ; i <= up / 2 ; i ++){
                num[i] = nex[2 * i];
                ans += num[i];
            }
            up /= 2;
        }
        cout << ans << '
    ';
        return 0;
    }
    View Code
  • 相关阅读:
    HDU 1224 无环有向最长路
    HDU 1220 简单数学题
    HDU 1203 背包问题
    HDU 1176 DP
    HDU 1159 LCS最长公共子序列
    HDU 1160 排序或者通过最短路两种方法解决
    hdu 2349 最小生成树
    次小生成树的学习
    最小生成树prime算法模板
    poj 1679 判断最小生成树是否唯一
  • 原文地址:https://www.cnblogs.com/GoodVv/p/13594942.html
Copyright © 2011-2022 走看看