首页 > 其他分享 >CF865B Ordering Pizza 题解

CF865B Ordering Pizza 题解

时间:2023-01-06 17:56:40浏览次数:60  
标签:std s2 Ordering 题解 s1 披萨 CF865B 幸运值 using

简要题意:有 \(n\) 个人去披萨店吃披萨,有两种披萨,每个披萨有 \(m\) 片。现在第 \(i\) 个人要吃 \(c_i\) 片披萨,如果吃一片第一种披萨会获得 \(a_i\) 的幸运值,如果吃一片第二种披萨会获得 \(b_i\) 的幸运值。现在需要购买最少数量的披萨使得每个人都吃饱并且所有人获得的幸运值之和最大。

贪心,如果一个人吃第一种披萨幸运值更高就让他只吃第一种披萨,吃第二种披萨幸运值更高就让他只吃第二种披萨,这样就能使幸运值之和最大了。
不过有个问题,这样无法保证买最少的披萨。比如说一个披萨是 \(5\) 片,第一种披萨买了 \(6\) 片,第二种披萨买了 \(7\) 片,总共买了 \(4\) 个披萨,但实际上买 \(3\) 个披萨就够了。把买第一种披萨比整个多出的数量记作 \(s1\),买第二种披萨比整个多出的数量记作 \(s2\),若 \(s1+s2>m\),代表没办法买更少的披萨惹。
否则按照吃两种披萨获得的幸运值之差从小到大排序,按照幸运值之差从小到大排序可以保证失去的幸运值最小,把多出来的那些减掉,也就是在吃第一种披萨中把 \(s1\) 个人改成吃第二种披萨,或者在吃第二种披萨中把 \(s2\) 个人改成吃第一种披萨,两种方案取更优的就行了。

代码:

//不向焦虑与抑郁投降,这个世界终会有我们存在的地方。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#define int loli
#define all(x) std::begin(x),std::end(x)
using std::cin;using std::cout;
using std::max;using std::min;
using loli=long long;
using pii=std::pair<int,int>;
int n,m,s1,s2,c1,c2,ans;;
std::vector<pii>b1,b2;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	cin>>n>>m;
	for(int c,a,b;n--;)if(cin>>c>>a>>b,a>b){
		ans+=a*c;
		b1.emplace_back(a-b,c);
		s1+=c;
	}else{
		ans+=b*c;
		b2.emplace_back(b-a,c);
		s2+=c;
	}
	s1%=m;s2%=m;
	if(s1+s2>m)return cout<<ans,0;
	sort(all(b1));
	sort(all(b2));
	for(auto[k1,k2]:b1){
		c1+=min(k2,s1)*k1;
		s1-=min(k2,s1);
		if(s1<=0)break;
	}
	for(auto[k1,k2]:b2){
		c2+=min(k2,s2)*k1;
		s2-=min(k2,s2);
		if(s2<=0)break;
	}
	cout<<ans-min(c1,c2);
	return 0;
}

标签:std,s2,Ordering,题解,s1,披萨,CF865B,幸运值,using
From: https://www.cnblogs.com/bxjz/p/CF865B.html

相关文章

  • configmap出现/n问题解决
    1.现象原始文件肉眼显示正常,如下图命令行显示整个data部分成了一坨,回车全变成了/n,虽然不影响使用,但是对维护查看比较麻烦,如下图2.问题原因1.配置文件里有一些Tab......
  • [CTSC2009]魔幻花园 题解
    [CTSC2009]魔幻花园题解洛谷链接。一、问题转化原问题等价于求某个水平面上所有点围成凸包的面积的最小值。首先考虑把三维问题转化到二维上:考虑到任意时刻所有点都在......
  • I. 西行妖下题解
    题目内容原题链接样例输入5201样例输出?44232?35155?52431!32154题解首先,题目有一个很难解决的痛点,就是他只会返回最前面的那......
  • Codeforces Round #842 (Div. 2) A-D题解
    比赛链接A、GreatestConvex非常的简单。根据样例直接猜是输出\(n-1\).上一个\(Python\)代码。T=int(input())whileT>0:T-=1n=int(input())......
  • USACO Au题解
    T1一眼背包,但是很怪考虑设dp[i][j][k]表示前i个物品还剩j个月饼还剩k个冰激凌。$O(n^4)$显然。转移O(n)枚举用钱还是优惠券。瓶颈在于冰激凌的优惠。考虑如何把这一......
  • idea 内存参数修改不生效问题解决 VM参数设置不生效解决
    提示:在idea的工具栏Help->EditCustomVMOptions内修改 对应参数-Xmx1024m后重启无效的再看下面的方法 问题:ieda的默认内存大小是1024M当我开多个工......
  • PIP 更新后不能使用的使用 提示: No module named 'pip'问题解决
    1、问题引入   正确安装Python以后,Python和PIP都可以正常使用。在使用pip安装其他库的时候,提示PIP版本过低,建议更新,结果更新时发生错误,导致PIP不能被识别,具体如下图......
  • 【题解】P2305 [NOI2014] 购票
    题意给定一棵边带权且以\(1\)为根的树,从后代结点\(u\)跳到祖先结点\(v\)的代价为\(dp_u+q_u\),其中\(p_u,q_u\)是给定的常数,\(d\)是\(u,v\)的树上距离。要......
  • BalticOI 2004 Sequence 题解
    题目链接在这里~对于序列\(\{a\}\),把每一个\(a_i\)减去一个\(i\),得到\(\{a'\}\)序列\(\{b\}\)同理。因为\(b_1<b_2<...<b_n\),故\(b_1'\leqslantb_2'\leqslant...\leqs......
  • ATC简单题解(不定时更新
    ABC129前三题略D.lamp虽然数据范围不大,但也没法暴力check,可以考虑分别维护每行(每列)障碍物的纵(横)坐标,可以考虑到插入std::vector中,然后对于每一个点查找横竖方向上的......