首页 > 其他分享 >cf round 898 (div.4) E

cf round 898 (div.4) E

时间:2024-11-12 12:30:01浏览次数:1  
标签:珊瑚 898 mid 高度 cf long 水箱 int div.4

建造水族馆

题目描述

你喜欢鱼,所以你决定建造一个水族馆。你有一块由 n 根柱子组成的珊瑚,其中 i 根柱子高 ai 个单位。之后,你将在珊瑚周围建造一个水族箱,具体如下:

  • 选择一个整数 h --水箱的高度。在水箱两侧建造高度为 h 的墙壁。
  • 然后,在水箱中注满水,使每一列的高度都是 h ,珊瑚的高度超过 h 这一列就不能注水

例如, a=[3,1,2,4,6,2,5] ,高度为 h=4 ,最终总共需要使用 w=8 个单位的水,如图所示。

你最多可以用 x 个单位的水来装满水箱,但你想尽可能建造最大的水箱。你能选择的 h 的最大值 是多少?

输入

第一行包含一个整数 t( 1 <= t <= 10 4 ) - 测试用例数。

每个测试用例的第一行包含两个正整数 nx( 1 <= n <= 2 * 105 ; 1 <= x <= 109 )--珊瑚的列数和最大水量。

每个测试用例的第二行包含 n 个空格分隔的整数 ai ( 1 <= a1 <= 109; 1 <= x <= 109 )。( 1 <= ai <= 109) - 珊瑚的高度。

所有测试用例中 n 的总和不超过 2 * 105

输出

对于每个测试用例,输出一个正整数 h ( h >= 1 ) - 水箱的最大高度,因此最多需要 x 个单位的水才能装满水箱。

我们已经证明,在这些限制条件下, h 这个值总是存在的。

测试样例

输入

5
7 9
3 1 2 4 6 2 5
3 10
1 1 1
4 1
1 4 3 4
6 1984
2 6 5 9 1 8
1 1000000000
1

输出

4
4
2
335
1000000001

样例解释

第一个测试案例如语句所示。在 h=4 的情况下,我们需要 8 单位的水,但如果将 h 增加到 5 ,我们需要13 单位的水,这比 x=9 多。所以 h=4 是最佳方案。

在第二个测试案例中,我们可以选择 h=4 ,并在每列中添加 3 个单位,总共使用 9 个单位的水。可以证明这是最佳方案。

在第三个测试案例中,我们可以选择 h=2 ,并使用所有的水,因此这是最优方案。

易错

上边界是珊瑚最大高度和最大水量高度的总和,并非只是最大水量的高度,所以r初始化为2e9 + 10,而不是1e9 + 10

  • 样例5 则说明了这一点,只有一个珊瑚,结果就是最大水量和珊瑚高度加在一起

代码

#include <iostream>

const int N = 2e5 + 10;
long long a[N];
using namespace std;

int main()
{
    int t; cin >> t;
    while(t--)
    {
        int n, x;
        long long max = 0;
        cin >> n >> x;
        for(int i = 0; i < n; i++) cin >> a[i];
        long long l = 0, r = 2e9 + 10;
        while(l < r)
        {
            long long mid = l + r + 1 >> 1;
            long long ans = 0;
            bool goal = true;
            for(int i = 0; i < n; i++)
            {
                if(a[i] < mid) ans += mid - a[i];
                if(x < ans)
                {
                    r = mid - 1, goal = false;    //若不满足条件,则说明h过高,要降低h;所以要在左边寻找,当前的mid不满足条件
                    break;
                }
            }
            if(goal) l = mid;
        }
        cout << l << endl;
    }
}

标签:珊瑚,898,mid,高度,cf,long,水箱,int,div.4
From: https://www.cnblogs.com/PeachyGalaxy/p/18541169/1112p

相关文章

  • CF1920
    SC真的在认真写喵,关注Sugar_Cube喵。()A没价值,略去。B给定一个可重集合,A选择至多k个数删除,然后B在剩下的数选至多x个取相反数。A想要和尽量大,B想要和尽量下,求两者都使用最佳决策的情况下的结果。\(n\le10^5\)假如确定了删除哪些数,B肯定是尽量取反大数,故答案是......
  • CF785D 题解
    CF题目luogu题目题解似乎清一色是同一个做法,这里给一个容斥的做法。首先枚举一个位置\(i\),设\([1,i]\)的左括号个数为\(p\),\([i+1,n]\)的右括号个数为\(q\),那么以\(i\)这个位置为分界点的合法括号数有\(\sum_{i=1}^{\min(p,q)}C_p^iC_q^i\)个。通过范德蒙德卷......
  • CF 1325 题解
    CF1325题解AEhAbAnDgCd有\(\gcd(1,x)=1,\text{lcm}(1,x)=x\),因此输出\(1x\).BCopyCopyCopyCopyCopy要求严格上升子序列,那么答案的上界当然是去重后的元素个数.能否取到上界呢?当然可以,每一段内选一个你想要的就可以了.CEhabandPath-eticMEXs发现\(0,......
  • Educational Codeforces Round 80 (CF1288)
    EducationalCodeforcesRound80(CF1288)A.Deadline题意给出正整数\(n,d\),求不等式\(x+\lceil\frac{d}{x+1}\rceil\len\)是否有非负整数解。思路先不考虑上取整,\[x+\frac{d}{x+1}=x+1+\frac{d}{x+1}-1\ge2\sqrtd-1\]当且仅当\(x+1=\frac{d}{x+1}\)即\(......
  • 「杂题乱刷2」CF1288E
    题目链接CF1288EMessengerSimulator解题思路发现向前移的部分普通维护比较困难,因此我们考虑通过某种方式来维护这个东西。考虑建立\(m\)个虚点来维护,每次询问都将实点移至虚点去。这里求答案我们需要支持单点加,区间求和,可以用树状数组轻松维护。参考代码#include<bits/s......
  • CF Round 985
    比赛链接A.Set#include<iostream>#include<cstdio>usingnamespacestd;intmain(){intt;scanf("%d",&t);while(t--){intl,r,k;scanf("%d%d%d",&l,&r,&k);printf("%......
  • 「杂题乱刷2」CF1219G
    题目链接CF1219GHarvester解题思路就是个嗯分讨题。发现最终选择的方案总共就以下五种情况:选\(4\)行\(0\)列。选\(3\)行\(1\)列。选\(2\)行\(2\)列。选\(1\)行\(3\)列。选\(0\)行\(4\)列。对于第一,五种情况,直接取每行或每列的前四大值......
  • CF 1257 题解
    CF1257题解ATwoRivalStudents每次交换都可以让距离增加\(1\),上界是\(n-1\).题目说至多而不是恰好交换\(x\)次,于是不需要考虑边界.BMagicStick一个重要的观察是:如果能够得到\(x\),那么就能得到任意小于等于\(x\)的数,这是操作二保证的.考虑操作\(1\)......
  • CF1821
    建议结合独立思考使用本题解。A没什么价值略去。B有一个序列\(a\),通过把它的一个子区间进行升序排序生成了\(b\)。现在给出\(a,b\),求出可以通过该操作使\(a\)变为\(b\)的最长子区间的左右端点,输出任意一个。\(n\le2\times10^5\)如果存在一个位置,使得\(a_{p}\neq......
  • 【题解】CF1993【EF】
    A注意到一种选项最多填对\(n\)个题所以答案是\(\min(n,cnt_a)+\min(n,cnt_b)+\min(n,cnt_c)+\min(n,cnt_d)\)B注意到操作只能让奇数变多,偶数变少,所以我们只能把偶数全变成奇数特判掉全是偶数的情况,容易得到答案下界:偶数个数容易想到一个naive贪心做法:每次都拿出奇数......