本文主要是介绍Codeforces Round #437 Div. 2 C. Ordering Pizza,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
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 si, ai, 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
题目大意
一共有两种Pizza,每个Pizza有S片,有n位选手,每位选手吃si片Pizza,其中第一种Pizza吃一片获得的快乐值为ai,第二种为bi。问在保证提供的Pizza个数最小的情况下所能获得的最大的快乐值。
解题思路
先假定每位选手都吃获得快乐值更大的那种Pizza,并将获得的快乐值差值和所需片数对应记录起来,根据贪心策略求得一个happy值。此时最后需要的Pizza片数一种类为use1,二种类为use2,若两者之和小于S,这说明最后的use1+use2片需要由同一种类提供(保证提供Pizza片数最小)。则用happy值减去min(use1变为二种类提供的happy差值,use2变为一种类提供的happy差值)即为最终答案。
代码实现
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
vector<pair<ll,ll> >mark1,mark2;int main()
{int N,S;ll s,a,b;ll happy,use1,use2;while(~scanf("%d %d",&N,&S)){mark1.clear();mark2.clear();happy=0,use1=0,use2=0;for(int i=0;i<N;i++){scanf("%I64d %I64d %I64d",&s,&a,&b);if(a<b){happy+=(s*b);use2=(use2+s)%S;mark2.push_back(make_pair(b-a,s));}else{happy+=(s*a);use1=(use1+s)%S;mark1.push_back(make_pair(a-b,s));}}if(use1+use2>S){printf("%I64d\n",happy);continue;}sort(mark1.begin(),mark1.end());sort(mark2.begin(),mark2.end());vector<pair<ll,ll> >::iterator it;ll a1=0,a2=0;for(it=mark1.begin();it!=mark1.end();it++){a1+=min((*it).second,use1)*(*it).first;use1-=min((*it).second,use1);}for(it=mark2.begin();it!=mark2.end();it++){a2+=min((*it).second,use2)*(*it).first;use2-=min((*it).second,use2);}happy-=min(a1,a2);printf("%I64d\n",happy);}return 0;
}
这篇关于Codeforces Round #437 Div. 2 C. Ordering Pizza的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!