POWEROJ 1168-A F(x)(找规律&二分查找)

题目链接:1168-A

题意

Time Limit: 1000 MS Memory Limit: 65536 KB

Description

小明有一个不降序列(f(1),f(2),f(3),……),f(k)代表在这个序列中大小是k的有f(k)个。我们规定f(n)的前12项如下图。

n           1    2    3    4    5   6   7   8   9   10   11   12

f(n)        1    2    2    3    3   4   4   4   5   5    5    6

现在给你一个n,你知道f(n)是多少吗?

Input

多组测试数据

每组一个n(1<=n<=2000,000,000)。

Output

输出f(n)。

Sample Input

Raw

100

9999

123456

Sample Output

Raw

21

356

1684

思路

因为n的最大范围是20亿,显然不能数组保存,而且时间也不允许,也很难发现什么规律。

我们可以换个角度,既然要找的是f[n]的值,那么我们把f[x]=i时的最大x记录为 d[i] = x;

照此推算:

d[1] = 1

d[2] = 3

d[3] = 5

d[4] = 8

d[5] = 11

仔细推敲不难发现规律

从3起,d[i] = d[i-1] + find(i); find(i) = min(k) 当d[k]>=i时

find(i)也就是d数组中大于等于i的一项的最小值的下标。

代码

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

const int N = 5000086;
int d[N];

int find(int l, int r, int x)
{
    while(l < r)
    {
        int mid = (l+r)/2;
        if(d[mid] < x)
            l = mid+1;
        else
            r = mid;
    }
    return r;
}

int main()
{
    int n;
    d[1] = 1;
    d[2] = 3;
    int i;
    for(i=3; ; i++)
    {
        d[i] = d[i-1] + find(1, i-1, i);
        if(d[i] > 2000000000)
            break;
    }
    while(~scanf("%d", &n))
        printf("%d\n", find(1, i, n));
    return 0;
}
时间: 2024-10-13 01:08:50

POWEROJ 1168-A F(x)(找规律&二分查找)的相关文章

【8.31校内测试】【找规律二分】【DP】【背包+spfa】

打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16... 嗯嗯嗯?没有规律?我们把每个数出现的次数列出来: 2 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 然后惊觉表中的数字是连续的,每个都至少有一个,而分解因数中有只要2的幂,有一个就会加一,比如8是2.4.8的倍数,在1的基础上会多三个.(1和2除外) 所以对于一个位置$x$,我们可

LeetCode-Find Minimum in Rotated Sorted Array II-旋转排序数组找最小-二分查找

https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 允许重复,也就意味着会有a[l]==a[r],以及a[mid]==a[r]的情况出现.后者比较好办,从坐标图中看出直接r=mid即可. 前者会有一个问题是当a[mid]==a[r]时,无法确定这个中间值在折线上的位置,此时退化为线性搜索,令l++.所以这个算法最差情况下是O(n)的. class Solution { public: int n,m;

【推导】【找规律】【二分】hdu6154 CaoHaha&#39;s staff

题意:网格图.给你一个格点多边形的面积,问你最少用多少条边(可以是单位线段或单位对角线),围出这么大的图形. 如果我们得到了用n条边围出的图形的最大面积f(n),那么二分一下就是答案. n为偶数时,显然要尽量用斜边去拼矩形,于是f(i)=i*i/4-1 (i mod 4 == 2),f(i)=i*i/4-1(i mod 4 == 0). 当n为奇数时,尽量用i-1情况下的最长边向外扩张一个单位,于是f(i)=f(i-1)+[(i+1)/4]*2-1(i mod 2 == 1),方括号表示下取整.

ZOJ 3768Continuous Login(找规律然后二分)

Continuous Login Time Limit: 2 Seconds      Memory Limit: 131072 KB      Special Judge Pierre is recently obsessed with an online game. To encourage users to log in, this game will give users a continuous login reward. The mechanism of continuous log

长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&amp;&amp;水题

题目 链接 题意:给出x数列的定义: $T_0 = a$ $T_1 = b$ $T_n = T_{n-2} \bigoplus T_{n-1} $ 求第 $n$ 项( $0 \leqslant a,b,c \leqslant 10^{18} $) 分析 $n$ 这么大,肯定是常数时间复杂度. 打表找规律,能发现循环节为3. 或者直接推导,$a \bigoplus b = c, \ b \bigoplus c = a, \ c \bigoplus a = b$ #include<bits/stdc

[高精度][规律][二分] Jzoj P4213 对你的爱深不见底

Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y,但是因为小R 非常羞涩,所以他打算采用一些比较神奇的方式来表达.他定义了一些字符串,s1 = a,s2 = b,si =s_i-1  +  s_i-2  (i >=3).同时他定义了一个字符串s 的权值为一个最大的i <|s|满足s 长度为i 的前缀等于长度为i 的后缀.比如字符串aba 的权值就是1,abab 的权值就是2,aaaa 的权值就是3.现在小R 在明信片上给出了两个

【55测试】【字符串】【栈】【找规律】

集训第二天,额,考崩了. 第一题 hao 大意:(这个名字就不要在意了,其实是祖玛游戏) 模拟祖玛游戏的模式,给一个'A'~'Z'的字符串,然后有t个插入操作为 “ 添加后的在原字符串的位置 x  插入元素 c ”,字符串中有超过或等于 3 个相同的字符,则被消除,输出每次操作后剩余的字符串,如果为空,则输出“-”. 样例: ACCBA                     输出:  ABCCBA 5   AABCCBA 1 B AABBCCBA 0 A - 2 B A 4 C 0 A 解:

找规律/hdu 1005 Number Sequence

题意 给出a,b,n,已知f[1]=f[2]=1,f[i]=(a*f[i-1]+b*f[i-2]) mod 7 输出f[n] 数据范围 1 <= A, B <= 1000, 1 <= n <= 100,000,000 分析 首先,直接求..肯定是不行的 会tle 会mle 但是可以找到规律,例如对a=1,b=1 这个数据,有 f1=1 f2=1 f3=3 f4=5 f5=4 f6=0 f7=1 f8=1 f9=3 f10=5 f11=4 f12=0 ???? 我们会发现有一定的规律

hdu 2147 kiki&#39;s game(DP(SG)打表找规律)

题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n,m<=2000) 思路: dp[i][j]=0,说明从(i,j)这个点到时左下角先手败.dp[i][j]=1则先手胜. 然后记忆搜.但是记忆搜会超时. 搜完把整张表打出来,发现规律了,,,,然后,,,代码剩几行了. 代码: ///打表观察 /* int f[2005][2005]; int go(in