Codeforces 785C Anton and Fairy Tale

来源:互联网 发布:淘宝p图教程 编辑:程序博客网 时间:2024/06/06 00:44

题意:仓库里最多能放maxn个粮食,每天往仓库里添加k个粮食,如果添加k个粮食后超过了仓库的容量,那么就把超出的部分扔掉,也就是说仓库满了之后就不能再添加粮食了。同时每天都有鸟去偷吃粮食,第一天一只鸟,第二天两只鸟,第三天三只鸟...依此类推,每只鸟只能吃一个粮食,求仓库在第几天第一次为空

解题思路:二分法,可以直接推公式。如果k>=maxn,那么前maxn天都能补满仓库,第maxn天有maxn只鸟来吃,仓库就空了,所以这种情况就是在maxn天仓库第一次为空。如果k<maxn,那么在前k天仓库一定是满的,第k+1天早上是满的,晚上有k+1只鸟来吃,仓库就剩maxn-(k+1),第k+2天早上添加k个,此时仓库就有maxn-(k+1)+k,晚上k+2只鸟来吃就剩maxn-(k+1)+k-(k+2)=maxn-k-1-2...依此类推第k+m天晚上仓库就剩maxn-k-1-2-...-m=maxn-k-(m*(1+m)/2),假设第k+m天仓库第一次为空,根据maxn-k-(m*(1+m)/2)=0求解m,如果m-(ll)m>0,天数就加1,最后仓库第一次为空的天数就是k+m

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cmath>#include <cstdio>using namespace std;typedef long long int ll;int main(){    ll maxn,k;    while(scanf("%I64d%I64d",&maxn,&k)==2)    {        if(k>=maxn)        {            printf("%I64d\n",maxn);        }        else        {            double day1=(-1+sqrt(1-8*(k-maxn)))/2;            ll day;            if(day1-(ll)day1>0)day=day1+1;            else day=day1;            printf("%I64d\n",day+k);        }    }    return 0;}


原创粉丝点击