B. Ordering Pizza(思维,贪心)

本以为这题会是个大模拟,哎,我太笨了

吃 a 大 于 吃 b 的 人 我 们 倾 向 于 让 他 吃 a , 否 则 吃 b 吃a大于吃b的人我们倾向于让他吃a,否则吃b aba,b

但 是 这 里 要 是 完 全 按 照 这 个 规 则 可 能 最 后 买 的 披 萨 不 是 最 小 的 但是这里要是完全按照这个规则可能最后买的披萨不是最小的

把 人 分 成 两 类 , a > b 和 a < = b 的 把人分成两类,a>b和a<=b的 ,a>ba<=b

在 某 类 人 的 内 部 , 设 他 们 能 吃 x 片 披 萨 在某类人的内部,设他们能吃x片披萨 ,x

如 果 x 能 整 除 S ( 每 个 披 萨 的 片 数 ) , 那 肯 定 都 买 这 类 , 因 为 不 会 浪 费 如果x能整除S(每个披萨的片数),那肯定都买这类,因为不会浪费 xS(),,

否 则 买 x / S 个 这 种 披 萨 , 余 一 些 否则买x/S个这种披萨,余一些 x/S,

另 一 类 人 也 这 样 余 一 些 另一类人也这样余一些

当总共剩余的人大于S,无论如何都要买2个披萨,那不如买两种

否则,只买一类披萨,模拟一下即可

/*
买q*s块1,w*s块2 
就按照b-a来排序,越在前面的优先吃b 
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
struct p{
	int s,a,b;
};
bool maxa(p q,p w){
	return q.a-q.b<w.a-w.b;
}
bool maxb(p q,p w){
	return q.b-q.a<w.b-w.a;
}
vector<p>q,w;
int n,S,ans,sum1,sum2;
signed main()
{
	cin >> n >> S;
	for(int i=1;i<=n;i++)
	{
		p d;
		cin >> d.s >> d.a >> d.b;
		ans+=d.s*max(d.a,d.b);//暂时都取大的 
		if( d.a>d.b )	q.pb(d),sum1+=d.s;
		else	w.pb(d),sum2+=d.s;
	}
	sum1%=S,sum2%=S;
	if( sum1+sum2<=S )//只能买一种 
	{
		sort(q.begin(),q.end(),maxa);
		sort(w.begin(),w.end(),maxb);
		int temp1=0,temp2=0;
		for(int i=0;i<q.size();i++)
		{
			temp1+=min(sum1,q[i].s)*(q[i].a-q[i].b);
			sum1-=min(sum1,q[i].s);
		}
		for(int i=0;i<w.size();i++)
		{
			temp2+=min(sum2,w[i].s)*(w[i].b-w[i].a);
			sum2-=min(sum2,w[i].s);
		}
		ans-=min(temp1,temp2);
	}
	cout << ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值