题目链接: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 }
时间: 2024-12-21 09:53:30