【题意】
小明有一个不降序列(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)是多少吗?【解题思路】
暴力,看懂题意之后暴力解决这个问题。更快的效率是,求前缀和,然后二分位置。坑点,本oj这个题不能单组输入。
【AC代码】
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll a[20000000];
ll cnt=4;
void Init()
{
memset(a,0,sizeof(a));
a[1]=1;
a[2]=2;
a[3]=2;
for(ll i=3; i<=10000; i++)
{
for(ll j=1; j<=a[i]; j++)
{
a[cnt++] = i;
}
if(a[cnt]>800000)break;
}
}
int main()
{
Init();
ll n;
while(~scanf("%I64d",&n))
{
ll ans=0;
int pos;
for(int i=1; i<=cnt; i++)
{
ans += a[i];
if(ans>=n)
{
pos = i;
break;
}
}
printf("%d\n",pos);
}
return 0;
}