喵哈哈村的魔法考试 Round #10 (Div.2) C

喵哈哈村与哗啦啦村的大战(三)

发布时间: 2017年3月27日 09:41   时间限制: 1000ms   内存限制: 128M

喵哈哈村因为和哗啦啦村争夺稀有的水晶资源,展开了激烈的战斗!

对于喵哈哈村而言,现在有n个战士,每个战士的能力值是a[i],现在战士可以花费c[i]的代价使得自己的能力增加1点,或者降低1点。但是战士最终的能力值只能在l[i]与r[i]之间。

现在有个目标值s,你需要使得这n个战士的能力值之和为s才行。

问你是否可以,如果可以的话,请输出最小代价。

本题包含若干组测试数据。
第一行两个整数n,s;分别表示战士数量,战士能力值目标之和。
接下来n行,每行四个整数a[i],c[i],l[i],r[i],描述如题所示。

满足1<=n<=50000,1<=S<=10000000,1<=l[i]<=a[i]<=r[i]<=1000,1<=c[i]<=1000

如果可行的话,输出最小代价。
否则输出impossible

复制
3 6
1 1 1 3
1 2 1 3
1 3 1 3
4

题解:这个题目就是贪心一下,贪心思想是:从最小的代价开始增加或者减少能力值。这里有个注意的地方,就是有几个情况,当前的能力值等于预期值;当前的能力值小于预期值;当前的能力值大于
预期值。分情况讨论一下就好!
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e5+5;
 5 struct node{
 6     int v, c, l, r;
 7 }a[maxn];
 8 bool cmp(node a, node b){
 9     return a.c<b.c;
10 }
11 
12 int main(){
13     ll n, s;
14     while(cin>>n>>s){
15         int now=0, cnt=0, f=1;
16         for(int i=0; i<n; i++){
17             cin>>a[i].v>>a[i].c>>a[i].l>>a[i].r;
18             now+=a[i].v;
19         }
20         if(now==s) cout<<"0"<<endl;
21         else if(now<s){
22             sort(a, a+n, cmp);
23             int j;
24             for(j=0; j<n; j++){
25                 if((s-now)<=(a[j].r-a[j].v)){
26                     cout<<cnt+(s-now)*a[j].c<<endl;
27                     break;
28                 }else{
29                     cnt=cnt+(a[j].r-a[j].v)*a[j].c;
30                     now=now+(a[j].r-a[j].v);
31                 }
32             }
33             if(j>=n) f=0;
34         }else if(now>s){
35             sort(a, a+n, cmp);
36             int j;
37             for(j=0; j<n; j++){
38                 if((now-s)<=(a[j].v-a[j].l)){
39                     cout<<cnt+(now-s)*a[j].c<<endl;
40                     break;
41                 }else{
42                     cnt=cnt+(a[j].v-a[j].l)*a[j].c;
43                     now=now-(a[j].v-a[j].l);
44                 }
45             }
46             if(j>=n) f=0;
47         }
48         if(!f) cout<<"impossible"<<endl;
49     }        
50     return 0;
51 }
原文地址:https://www.cnblogs.com/ledoc/p/6649053.html