Codeforces//Cardboard for Pictures

Problem - E - Codeforces

题目:

输入要求:

输出要求:

样例输入:

10
3 50
3 2 1
1 100
6
5 500
2 2 2 2 2
2 365
3 4
2 469077255466389
10000 2023
10 635472106413848880
9181 4243 7777 1859 2017 4397 14 9390 2245 7225
7 176345687772781240
9202 9407 9229 6257 7743 5738 7966
14 865563946464579627
3654 5483 1657 7571 1639 9815 122 9468 3079 2666 5498 4540 7861 5384
19 977162053008871403
9169 9520 9209 9013 9300 9843 9933 9454 9960 9167 9964 9701 9251 9404 9462 9277 9661 9164 9161
18 886531871815571953
2609 10 5098 9591 949 8485 6385 4586 1064 5412 6564 8460 2245 6552 5089 8353 3803 3764

样例输出:

1
2
4
5
7654321
126040443
79356352
124321725
113385729
110961227
 

注意:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long n,c;
int a[N];
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>c;
        memset(a,0,sizeof a);//没多大用
        for(int i=1;i<=n;i++) cin>>a[i];
        int l=0,r=1e9;
        while(l<r)
        {
            long long mid=(l+r)/2;
            long long res=0;
            long long t,s;
            for(int i=1;i<=n;i++)
            {
               s=a[i]+2*mid;
               res+=s*s;
               if(res>c) break;
            }
            if(res>=c) r=mid;
            else l=mid+1;
        }
        cout<<l<<endl;
    }
    return 0;
}

题解:

这道题就是一道很典型的二分题,唯一的难点有两个。

其一可能是题目有些难懂,如果读懂题目那么不难看出就是一个二分。

题中的含义是让寻找到画和底板边的距离w,每组样例都给了每幅画的边长s,和所i用底板的总面积,而且所有画w的是一样的,那么很容易看出这就是一道二分题,只需要将每次二分的值mid当作w,带入公式去计算得到底板的总面积,拿去和题目给出的底板总面积c做比较即可,并且每次去更新一下边界就ok了(如果不会二分的话,建议先去补一下二分的知识)。

其二就是中间有一个细节会导致一些大的数据跑不出来答案

这是最关键的因为你每次二分去找你二分带入的总面积的时候如果全部相加就可能会爆long long,所以这一步就需要一下优化,而且还能有效的减少时间复杂度,就是每次将二分带入的面积更新后直接判断一下是否大于给定的总面积c,如果大于,(如果没有这一步,那么一些大数据可能就会爆long long了。)那么直接就可以结束累加总面积的那么循环直接出来进行二分的判断去进行二分边界的更新,

最后输出答案即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值