codeforces 785C Anton and Fairy Tale

题目链接:http://codeforces.com/problemset/problem/785/C

题意:仓库容量是n,一开始是满的,然后每天晚上可以往仓库里装m粮食,最多装到n。然后每天白天有鸟来吃粮食,一只鸟吃1单位。第i天有i只鸟。问你多少天鸟可以把粮食吃完。

分析:一开始读错题,导致wa了两发。如果n<=m的话,只有n只鸟的时候一天把他吃完,输出n。如果m<n的话,前m是肯定吃不完的,m天之后,从1开始计数,就是好比每天白天吃i+m,晚上装m,一天好比加了i。所以可以二分天数,但是最后一天不用计算装入的m。因此可以令n=n-m;然后以后每天吃i,i天一共吃i*(1+i)/2,比较与n的大小即可。最后输出二分的天数加上m。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 
 5 int main(){
 6     ios_base::sync_with_stdio(0);
 7     cin.tie(0);
 8     long long n,m;
 9     cin>>n>>m;
10     long long low=0,high=1e10;
11     long long ans;
12     long long num=n-m;
13     while(low<=high){
14         long long mid=(low+high)/2;
15         long long result=num-mid*(mid+1)/2;
16 
17         if(result>0){
18             low=mid+1;
19         }
20         else {
21             high=mid-1;
22             ans=mid;
23         }
24     }
25     if(n<=m){
26         cout<<n<<endl;
27     }
28     else cout<<ans+m<<endl;
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/ls961006/p/6947624.html