zoukankan      html  css  js  c++  java
  • The 15th UESTC Programming Contest Preliminary M

    地址:http://acm.uestc.edu.cn/#/problem/show/1557

    题目:

    Minimum C0st

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

    There are NN numbers where the ithith is AiAi.

    In order to make the sum of them changed to SS, you can make some numbers increased by one or decreased by one.

    But you should spend CiCi dollars to increase or decreased AiAi by one, and the new AiAi should satisfies LiAiRiLi≤Ai≤Ri.

    Any number can be operated any times. What's the minimum cost to make the sum of all numbers changed to SS?

    Input

    The first line contains two integers N,SN,S,

    Next NN lines each line contains four integers Ai,Ci,Li,RiAi,Ci,Li,Ri.

    1N1000,1S106,1Ci1000,0LiAiRi10001≤N≤1000,1≤S≤106,1≤Ci≤1000,0≤Li≤Ai≤Ri≤1000

    Output

    If there is no solutions, print impossible.

    Otherwise, print one integer indicates the minimum cost to make the sum of all numbers changed to SS.

    Sample input and output

    Sample InputSample Output
    3 6
    1 1 1 3
    1 2 1 3
    1 3 1 3
    4

    Source

    The 15th UESTC Programming Contest Preliminary
     
    题目:排序后贪心即可
     
    代码:
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    struct nmb
    {
        int dat,cost,l,r;
    }a[1010];
    
    bool cmp(nmb a,nmb b)
    {
        return a.cost<b.cost;;
    }
    
    int n,s,sum,ans,last;
    
    int main()
    {
        cin>>n>>s;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d%d",&a[i].dat,&a[i].cost,&a[i].l,&a[i].r);
            sum+=a[i].dat;
        }
        sort(a+1,a+n+1,cmp);
        sum-=s;
        sum=-sum;
        if(sum<0)
        {
            for(int i=1;i<=n;i++)
            {
                if(sum+a[i].dat-a[i].l>0)
                {
                    last=i;
                    break;
                }
                ans+=(a[i].dat-a[i].l)*a[i].cost;
                sum+=a[i].dat-a[i].l;
            }
            ans-=sum*a[last].cost;
            if(last!=0)
                sum=0;
        }
        else if(sum>0)
        {
            for(int i=1;i<=n;i++)
            {
                if(sum+a[i].dat-a[i].r<0)
                {
                    last=i;
                    break;
                }
                ans+=(a[i].r-a[i].dat)*a[i].cost;
                sum-=a[i].r-a[i].dat;
            }
            ans+=sum*a[last].cost;
            if(last!=0)
                sum=0;
        }
        if(sum!=0)
        {
            cout<<"impossible"<<endl;
            return 0;
        }
        cout<<ans<<endl;
        return 0;
    }

     

     

  • 相关阅读:
    vue promise
    vue 数组操作
    vue登录注册切换的坑
    筆記連接
    vue配置jquery和bootstarp
    css的寬高約束
    css框模型
    css居中flex
    css居中
    遍历forEach与map的区别-forEach踩坑记
  • 原文地址:https://www.cnblogs.com/weeping/p/6629468.html
Copyright © 2011-2022 走看看