Codeforces Round #437-贪心-C. Ordering Pizza

来源:互联网 发布:易语言手机轰炸机源码 编辑:程序博客网 时间:2024/06/05 06:09

http://codeforces.com/contest/867/problem/C
给定m个人,他们吃第一种披萨,吃一片可以获得a的幸福值。
吃2片可以获得b幸福值。他们每个人必须要吃x片。
并且每一个披萨是s片。
问你如何在最少的披萨饼书目下,得到的幸福值最大。
我开始一位计算一下每个人饼数的sum。 然后除s 向上取整
然后计算一下最优解,如果最优解的饼的数目小于等于这数目,就是yes。否则就转换饼的数目。
但是没有想到那个贪心的方式,贪一下a变为b。或者b换a
因为最优解不行,所以这个要求一定是比最优解小,我们只要保证尽可能的大就好了

#include <bits/stdc++.h>using namespace std;typedef long long ll;/* 贪心。*/struct Node{    ll v,num;    Node(int _a,int _b){        v=_a;        num=_b;    }};bool operator<(Node a,Node b){     return a.v>b.v;}priority_queue<Node>q;priority_queue<Node>p;ll m,s,num;ll a,b;int main(){   while(~scanf("%lld%lld",&m,&s)){          ll sum1=0;          ll sum2=0;          ll ans=0;          while(!q.empty()) q.pop();          while(!p.empty()) p.pop();          for(int i=0;i<m;i++){              scanf("%lld%lld%lld",&num,&a,&b);              if(a>=b){                 sum1=(sum1+num);                 q.push(Node(a-b,num));                 ans+=num*a;              }              else{                  sum2=(sum2+num);                   p.push(Node(b-a,num));                   ans+=num*b;              }          }          int tt1=0,tt2=0,tt3=0;          if(sum1%s)tt1=sum1/s+1;          else tt1=sum1/s;          if(sum2%s) tt2=sum2/s+1;          else tt2=sum2/s;          if((sum1+sum2)%s) tt3=(sum1+sum2)/s+1;          else tt3=(sum1+sum2)/s;          if(tt1+tt2<=tt3){              printf("%lld\n",ans);          }          else{              sum1=sum1%s;              sum2=sum2%s;              ll anss1=0;              ll anss2=0;              while(!q.empty()){                  if(sum1<=0) break;                  Node u=q.top();                  q.pop();                  anss1+=(u.v)*min(u.num,sum1);                  sum1-=min(u.num,sum1);              }              while(!p.empty()){                  if(sum2<=0) break;                  Node u=p.top();                  p.pop();                  anss2+=(u.v)*min(u.num,sum2);                  sum2-=min(u.num,sum2);              }              printf("%lld\n",ans-min(anss1,anss2));          }   }    return 0;}