zoukankan      html  css  js  c++  java
  • CodeForces

    题意:n根杆子,每根杆子由一定数量的砖组成,现要使这些砖一样高,添加一块砖花费A,去掉一块砖花费B,移动一块砖花费C,求最小花费

    通过观察可知最终所有杆子的高度与花费的关系是个凸函数,三分高度找极值点即可(其实就是二分斜率)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N=1e5+10;
     5 const ll inf=0x3f3f3f3f3f3f3f3fll;
     6 int n,A,R,M,a[N],mx;
     7 ll solve(int h) {
     8     ll x=0,y=0;
     9     for(int i=1; i<=n; ++i) {
    10         if(a[i]>h)x+=a[i]-h;
    11         else y+=h-a[i];
    12     }
    13     if(x>=y)return M*y+R*(x-y);
    14     else return M*x+A*(y-x);
    15 }
    16 ll tri(int l,int r) {
    17     while(r-l>1) {
    18         int mid=(l+r)>>1;
    19         if(solve(mid)<solve(mid+1))r=mid;
    20         else l=mid+1;
    21     }
    22     return min(solve(l),solve(r));
    23 }
    24 int main() {
    25     scanf("%d%d%d%d",&n,&A,&R,&M);
    26     M=min(M,A+R);
    27     for(int i=1; i<=n; ++i)scanf("%d",&a[i]);
    28     mx=0;
    29     for(int i=1; i<=n; ++i)mx=max(mx,a[i]);
    30     printf("%lld
    ",tri(0,mx));
    31     return 0;
    32 }
  • 相关阅读:
    CSS learnning...
    软件工程课程建议
    结对编程(三)
    结对编程(二)
    关于结对编程的感想
    关于“Durian”调查问卷的心得体会
    我的软件工程课目标
    软件工程课程建议
    进阶版《结对编程》
    结对编程实现四则运算
  • 原文地址:https://www.cnblogs.com/asdfsag/p/14668037.html
Copyright © 2011-2022 走看看