Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) C - Ordering Pizza

都选最优的,最多会多出一盒饼,然后减去最少的就行了

#include <bits\stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
const int maxn=1e5+9;
vector< pair<long long ,long long> >aa,bb;
bool cmp(pair<long long ,long long> a, pair<long long ,long long> b)
{
    return a.first<b.first;
}
long long s[maxn],a[maxn],b[maxn];
int main(){
  //freopen("test.in","r",stdin);
  int n;
long long s1;
long long len1,len2,ans,ans1,ans2,len;
len=len1=len2=0;
ans1=ans2=0;
scanf("%d%I64d",&n,&s1);
for(int i=1;i<=n;i++)
{
    scanf("%I64d%I64d%I64d",&s[i],&a[i],&b[i]);
    len+=s[i];
    if(a[i]<b[i])
    {
        len1+=s[i];
        ans1+=b[i]*s[i];
        aa.pb(mp(b[i]-a[i],s[i]));
    }
    else
    {
        len2+=s[i];
        ans2+=a[i]*s[i];
        bb.pb(mp(a[i]-b[i],s[i]));
    }
}
if((len/s1+(len%s1==0?0:1))>=((len2/s1+(len2%s1==0?0:1))+(len1/s1+(len1%s1==0?0:1))))//这个判断少加了点东西,终测挂了,挂我锁他了,结束之前就发现错误了
    printf("%I64d\n",ans1+ans2);
else
{
    len1=len1%s1;
    len2=len2%s1;
    len1=min(len1,s1-len2);
    len2=min(len2,s1-len1);
    long long tmp1,tmp2;
    tmp1=tmp2=0;
    long long sum1=0;
    long long sum2=0;
    sort(aa.begin(),aa.end(),cmp);
    sort(bb.begin(),bb.end(),cmp);
   for(int i=0;i<aa.size();i++)
   {
       if(tmp1+aa[i].second<len1)
       {
           tmp1+=aa[i].second;
           sum1+=aa[i].second*aa[i].first;
       }
       else
       {
           sum1+=(len1-tmp1)*aa[i].first;
           break;
       }
   }
    for(int i=0;i<bb.size();i++)
   {
       if(tmp2+bb[i].second<len2)
       {
           tmp2+=bb[i].second;
           sum2+=bb[i].second*bb[i].first;
       }
       else
       {
           sum2+=(len2-tmp2)*bb[i].first;
           break;
       }
   }
   // printf("%lld\n",ans1+ans2);
   ans=ans1+ans2-min(sum1,sum2);
   printf("%I64d\n",ans);
}
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值