codeforces 865B. Ordering Pizza

C. Ordering Pizza
time limit per test
 2 seconds
memory limit per test
 256 megabytes
input
 standard input
output
 standard output

It's another Start[c]up finals, and that means there is pizza to order for the onsite contestants. There are only 2 types of pizza (obviously not, but let's just pretend for the sake of the problem), and all pizzas contain exactly S slices.

It is known that the i-th contestant will eat si slices of pizza, and gain ai happiness for each slice of type 1 pizza they eat, and bi happiness for each slice of type 2 pizza they eat. We can order any number of type 1 and type 2 pizzas, but we want to buy the minimum possible number of pizzas for all of the contestants to be able to eat their required number of slices. Given that restriction, what is the maximum possible total happiness that can be achieved?

Input

The first line of input will contain integers N and S (1 ≤ N ≤ 105, 1 ≤ S ≤ 105), the number of contestants and the number of slices per pizza, respectively. N lines follow.

The i-th such line contains integers siai, and bi (1 ≤ si ≤ 105, 1 ≤ ai ≤ 105, 1 ≤ bi ≤ 105), the number of slices the i-th contestant will eat, the happiness they will gain from each type 1 slice they eat, and the happiness they will gain from each type 2 slice they eat, respectively.

Output

Print the maximum total happiness that can be achieved.

Examples
input
3 12
3 5 7
4 6 7
5 9 5
output
84
input
6 10
7 4 7
5 8 8
12 5 8
6 11 6
3 3 7
5 9 6
output
314
Note

In the first example, you only need to buy one pizza. If you buy a type 1 pizza, the total happiness will be 3·5 + 4·6 + 5·9 = 84, and if you buy a type 2 pizza, the total happiness will be 3·7 + 4·7 + 5·5 = 74.

题意:

有N个参赛者,需要准备披萨,有两种披萨,每一种披萨都有S片,分配给这些参赛者,每一个参赛者需要吃的披萨数量不定,接下来N行是每一个参赛者的信息,分别是需要吃的片数,吃了第一种获得的幸福感,吃了第二种披萨的幸福感。求用最少的可以满足这些需求的披萨,求出其中最大的幸福值。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector< pair<ll,ll> >a,b;
ll n,s,ans,na,nb,ta,tb;

signed main()
{
	ll ss,aa,bb;
	pair<ll,ll>k;
	scanf("%I64d%I64d",&n,&s);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld",&ss,&aa,&bb);
		if(aa>bb)
		{
			ans+=ss*aa;
			na+=ss;
			k.first=aa-bb;
			k.second=ss;
			a.push_back(k);
		}
		else
		{
			ans+=ss*bb;
			nb+=ss;
			k.first=bb-aa;
			k.second=ss;
			b.push_back(k);
		}
	}
	cout<<na<<"     "<<nb<<endl;
	na%=s;nb%=s;
	cout<<ans<<endl;
	if(na+nb>s)
	{
		printf("%lld\n",ans);
		return 0;
	}
	sort(a.begin(),a.end());
	sort(b.begin(),b.end());
	for(int i=0;na;i++)
	{
		ta+=min(na,a[i].second)*a[i].first;
		na-=min(na,a[i].second);
		cout<<"ta "<<ta<<"     "<<"na "<<na<<endl;
	}
	for(int i=0;nb;i++)
	{
		tb+=min(nb,b[i].second)*b[i].first;
		nb-=min(nb,b[i].second);
		cout<<"tb "<<tb<<"     "<<"nb "<<nb<<endl;
	}
	ans-=min(ta,tb);
	printf("%I64d\n",ans);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值