cf div2(262)c题

通过二分查找的方法,在限定的操作次数内,找到能使所有花达到的最大最小高度。
C. Present
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Little beaver is a beginner programmer, so informatics is his favorite subject. Soon his informatics teacher is going to have a birthday and the beaver has decided to prepare a present for her. He planted n flowers in a row on his windowsill and started waiting for them to grow. However, after some time the beaver noticed that the flowers stopped growing. The beaver thinks it is bad manners to present little flowers. So he decided to come up with some solutions.

There are m days left to the birthday. The height of the i-th flower (assume that the flowers in the row are numbered from 1 to n from left to right) is equal to ai at the moment. At each of the remaining m days the beaver can take a special watering and water w contiguous flowers (he can do that only once at a day). At that each watered flower grows by one height unit on that day. The beaver wants the height of the smallest flower be as large as possible in the end. What maximum height of the smallest flower can he get?

Input

The first line contains space-separated integers nm and w (1 ≤ w ≤ n ≤ 105; 1 ≤ m ≤ 105). The second line contains space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109).

Output

Print a single integer — the maximum final height of the smallest flower.

Sample test(s)
input
6 2 3
2 2 2 2 1 1
output
2
input
2 5 1
5 8
output
9
Note

In the first sample beaver can water the last 3 flowers at the first day. On the next day he may not to water flowers at all. In the end he will get the following heights: [2, 2, 2, 3, 2, 2]. The smallest flower has height equal to 2. It's impossible to get height 3 in this test.



题目大意:给你n多花,进行m次操作,每次操作使连续的w多花高度加一,求m次操作后使得最矮花高度最大,输出他的高度

解题思路:首先我们二分可能到达的高度,让后check是否所有花能到大吃高度,如果能,我们继续找更大的,如果不能,就找更小的。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf  1000100000
#define N 100005
#define LL long long

int n,m,w;
int a[N],f[N];
bool check(int x)
{
    int k=m,i,d;
    memset(f,0,sizeof(f));
    for(i=1;i<=n;i++)
    {
        f[i]+=f[i-1];
        d=max(0,x-a[i]-f[i]);
        k-=d;
        f[i]+=d;
        f[min(i+w,n+1)]-=d;
        if(k<0)
            return false;
    }
    return true;
}
int main()
{
    int i;
    while(scanf("%d%d%d",&n,&m,&w)!=EOF)
    {
        LL mi=inf;
        LL ma=-inf;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            mi=min(mi,(LL)a[i]);
            ma=max(ma,(LL)a[i]);
        }
        LL l=mi,r=ma+m;
        LL mid,ans;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(check(mid))
            {
                l=mid+1;
                ans=mid;
            }
            else
                r=mid-1;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}




在 Codeforces 平台上,评分(rating)为 1600 到 2500 的目通常属于中等到较难的范围。然而,其中一些目虽然评分较高,但其解法相对简单,但由于细节实现、边界条件处理或思维误区,容易导致错误(WA)。这类目往往对算法思维和实现细节要求较高,但并不一定需要复杂的算法知识。 ### 目类型和特点 以下是一些在 1600 到 2500 评分区间内,相对简单但容易出错的目类型: - **贪心算法**:例如区间调度、最大覆盖等,容易因为贪心策略选择不当导致错误[^1]。 - **二分查找**:边界条件(如 `low <= high` 或 `low < high`)的误判,可能导致无限循环或错误结果[^1]。 - **字符串处理**:正则表达式、模式匹配、特殊字符处理等,容易因输入格式不规范或边界条件而出现错误[^1]。 - **模拟**:逻辑复杂但不涉及高级算法,可能因为细节处理不当出错[^1]。 ### 推荐练习策略 1. **筛选目**:可以使用 Codeforces 的标签筛选功能,结合以下标签进行练习: - `implementation` - `greedy` - `binary search` - `math` - `constructive algorithms` 2. **关注“WA 高发”**:在 Codeforces 上,可以关注那些通过率较低(如 AC Submission Ratio 较低)的目,这类目通常存在陷阱[^1]。 3. **练习经典**: - **Codeforces Round #603 (Div. 2) - Problem B**:涉及数学思维,容易在边界条件上出错[^1]。 - **Codeforces Round #598 (Div. 3) - Problem D**:关于二分查找,实现时容易出现逻辑错误[^1]。 - **Codeforces Round #616 (Div. 2) - Problem C**:贪心策略应用,但需要仔细处理特殊情况[^1]。 ### 示例代码 以下是一个简单的二分查找实现,展示了如何避免常见的边界条件错误: ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 该实现通过 `while left <= right` 保证了所有可能的区间都被覆盖,并且在每次循环中正确更新 `left` 和 `right` 的值,从而避免无限循环或遗漏目标值的情况[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值