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

     

     

  • 相关阅读:
    const关键字在C和C++区别
    配置Office DOM组件权限
    SQL-Server新建表,当前日期为表名
    通过css样式给表格tbody加垂直滚动条
    Linq 左连接 left join
    如何在SVN服务器上创建项目
    C# 实现实体类和Xml转换
    C# 导出Excel表格
    SQL语句和EF Group by 用法
    C# fileUpload视频上传
  • 原文地址:https://www.cnblogs.com/weeping/p/6629468.html
Copyright © 2011-2022 走看看