Codeforces Round #643 (Div. 2)(C,E补题)

C题题意:
给定图片说明 ABCD是范围,然后求xyz构成的合法三角形的个数
题解:
枚举图片说明 的值,然后可以直接算出图片说明 的范围和图片说明 的范围

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
ll ans=0;
for(int i=max(a+b,c+1);i<=b+c;i++)//2 3 6 10,此时x=2,y=3,z最小要取6,不合法
{
    int l=max(a,i-c);
    int r=min(b,i-b);//x范围
    if(l<=r)
    ans+=1ll*(r-l+1)*(min(d,i-1)-c+1);
}
cout<<ans;
}

二分针对的是单调函数,那么三分针对的是双调函数
E题题意:
给定n个高度不同的,然后要使n个变成高度相同的,然后有三个操作:
增加消耗A,删除一个消耗R,从一个上面移动到另一个上面消耗M
然后问最小消耗
题解:
图片说明
然后暴力三分,三分其相等高度的值

#include<bits/stdc++.h>
using namespace std;
long long h[100009];
long long ans=1e18;
int n,a,r,m;
long long f (long long t)
{
    long long c_a=0,c_r=0;
    for(int i=0; i<n; i++)
        if(h[i]<t)
            c_a+=t-h[i];
        else
            c_r+=h[i]-t;
    long long c_m=min(c_a,c_r);
    c_a-=c_m,c_r-=c_m;
    long long   ans1=a*c_a+r*c_r+m*c_m;
    ans=min(ans,ans1);
    return ans1;
}
int main()
{

    cin>>n>>a>>r>>m;
    m=min(a+r,m);
    for(int i=0; i<n; i++)
        cin>>h[i];
    long long tl=0,tr=1e9+3;
    while(tl<tr)
    {
        long long t1=tl+(tr-tl)/3;
        long long t2=tl+(tr-tl)/3*2;
        if(f(t1)>=f(t2))
            tl=t1+1;
        else
            tr=t2-1;
    }
    cout<<ans;
}
全部评论

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
北漂的牛马人:211佬,包进的,可能是系统问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务