算法基础训练 50 题(三)二分
#JC0301.# Angry Cows
利用二分,来查找距离值,通过判断该距离值是否能安排的下所有的牛来调整l和r。
1 | int n,m,a[100005]; |
#JC0302.# Best Cow Fences
利用二分,查找平均数,并判断是否存在长度不低于L的子串能达到该平均数平均数。l的初始之为-1e6,r的初始值为1e6。计算出中间值m后,将Ai中的每一个数减去m,大于平均值m的数结果为正,小于平均值m的数结果为负;然后再计算一个前缀和数组d,求最大的平均值,需要找到前缀和d中最少的一个和最大的值,并保证最大的值在最小的值右边,且相距大于L。
1 | int n,ll,a[100005]; |
#JC0304.# Chat Ban
利用二分,找到能发的后一条消息,l和r存储发信息的条数,如果m小于k,则用求和公式m(m+1)/2算出发送的标签数,如果大于k,则用求和公式算出未发出的表情数,并用总数减去未发出的表情数,得到已发的表情数:kk-(2k-1-m) (2*k-1-m+1)/2
1 | LL t,k,x; |
#JC0305.# Cow Acrobats
利用贪心,先将数组按照w+s值排序,然后再求出前缀和并利用前缀和和求出危险值的最大值。
1 | struct cow |
#JC0306.# Fly
最节省的方法便是最后着陆后用完全部的燃料,于是可以倒求出着陆需要的燃料值,不断倒求出燃料值,得到最小的发射燃料量。如果一个燃料只能起飞或着陆1吨的火箭,则永远无法使火箭起飞或着陆。
1 | int n; |
#JC0307.# Hamburgers
利用数学关系硬算即可。
1 | LL n[3],p[3],r,ans,t[3],z[3],am,m; |
#JC0308.# Keshi Is Throwing a Party
利用二分,判断是否能找到中间值m个人满足题目要求。
1 | int t; |
#JC0309.# Monthly Expense
利用二分,查找合适的花费值,l的初始值为每天花费的最小值,r的初始值为总花费。判断是否能分出M组。
1 | int n,m,a[100005]; |
#JC0310.# New Year’s Problem
利用二分,l和r寻找joy值,然后将矩阵中的每一个joy值减去中间值m,并判断每一列是否都有一个值大于m,任意有一行有两个值大于m。
1 | int t,n,m; |
#JC0311.# Poisoned Dagger
利用二分,查找k值,并判断k值伤害是否能达到h。
1 | LL t,n,h,a[101]; |