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;
    }

     

     

  • 相关阅读:
    修改mysql密码的四种方法
    phpcms模板生成原理
    如何给虚拟主机安装phpMyAdmin
    如何修改数据库密码
    web 服务器、PHP、数据库、浏览器是如何实现动态网站的
    编写shell时,提示let/typeset:not found
    Linux下采用VI编辑器删除复制或移动多行文本内容
    BASH 学习笔记小结
    list容器的C++代码实现
    Groovy入门教程
  • 原文地址:https://www.cnblogs.com/weeping/p/6629468.html
Copyright © 2011-2022 走看看