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 }

时间: 2024-12-21 09:53:30

codeforces 785C Anton and Fairy Tale的相关文章

ural 1343. Fairy Tale打表

1343. Fairy Tale Time limit: 1.0 secondMemory limit: 64 MB 12 months to sing and dance in a ring their celestial dance. One after another they hold a throne. The first is young and fierce January and the last is elderly and wise December. Leaving the

Codeforces 734C Anton and Making Potions(枚举+二分)

题目链接:http://codeforces.com/problemset/problem/734/C 题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,第一类周瑜有m种,每种咒语使制作一个药的时间变成a[i],花费b[i]的魔力,第二类咒语有k种,每种咒语瞬间产生c[i]个药,花费d[i]的魔力,c[i]和d[i]都是不递减的,求最短时间内产生n个药的时间.解题思路:因为c[i]和d[i]都是不降的,所以可以枚举a[i],然后二分查找花费小于t-b[i]的第二类咒语.注

CodeForces 593B Anton and Lines

计算出每条线段在x1处的y坐标和x2处的y坐标. 就下来只要根据每条线段左右两处的y坐标就可以判断是否有交点. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; long long INF=9999999999999999; long long x1,x2; int n; struct X { long long k,b; l

CodeForces 734F Anton and School

位运算. 两个数的和:$A+B=(AandB)+(AorB)$,那么$b[i]+c[i]=n*a[i]+suma$.可以解出一组解,然后再按位统计贡献验证一下. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<v

CodeForces - 785C

二分穷举寻找正好吃完的那天,因为那天后被吃完,那天没被吃完,所以用二分搜索 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long int ll; ll m,n; int main() { scanf("%lld%lld",&n,&m); if(m

CodeForces 734B Anton and Digits

贪心.先取$256$,再取$32$. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<

CodeForces 734E Anton and Tree

$dfs$缩点,树形$dp$. 首先将连通块缩点,缩点后形成一个黑白节点相间的树.接下来的任务就是寻找一个$root$,使这棵树以$root$为根,树的高度是最小的(也就是一层一层染色).树形$dp$可以解决这个问题,第一次$dfs$处理子树,第二次$dfs$枚举$root$计算答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring>

codeforces 584E Anton and Ira [想法题]

题意简述: 给定一个$1$到$n(n<=2000)$的初始排列以及最终排列 我们每次可以选取位置为$i$和$j$的 并交换它们的位置 花费为$ |i-j| $ 求从初始状态变换到末状态所需最小花费 ----------------------------------------------------------------------------------------------------------- 比赛时这题留了$40min$ 然而自己贪心策略还是有漏洞 结束后看了首页的官方题解 感

CodeForces 785E Anton and Permutation

分块,暴力. 将序列分成$sqrt(n)$块,每块$sqrt(n)$个元素,每块内排序. 每次操作要计算这个区间中比$a[p1]$大的有几个,小的有几个,比$a[p2]$大的有几个,小的有几个,端点的块内暴力找,中间的块内二分找. 交换完数字之后,可以直接重新$sort$排个序. 总体时间复杂度$O(m*log(sqrt(n))*sqrt(n))$. #include <cstdio> #include <cmath> #include <cstring> #inclu