【Codeforces Round #437 (Div. 2) C】 Ordering Pizza
【链接】h在这里写链接
【题意】
每个参数者有3个参数,si,ai,bi;
表示第i个参赛者它要吃的披萨的片数,以及吃一片第一种披萨增加的幸福感,
以及吃一片第二种披萨增加的幸福感。
两种披萨都能任意数量地订购。
但是总数num有一个上限。
就是S*num>=∑si
且num最小。
也就是说相当于给你一个num;
让你求两种披萨各要买多少个a,b(a+b==num)。
使得参赛者的幸福感尽可能高。
(参赛者即可以选择第一种、也可以同时吃第二种)
【题解】
那么只能买一块披萨。
则买a或买b,那么每个人都只能选A或选B
取较大值就好。
矛盾点在哪里?
虽然你的a大,但是已经没有A披萨给你了
或者,全都买B披萨更合适
枚举最后买了多少个B披萨
i=0
则一开始全都吃A披萨
i=1
则让B-A前S大的人变成吃B披萨
i=2
则让B-A前2S大的人变成吃B披萨
在i=i-1的基础上改一下就好
记录到了哪一个人,那个人还能有多少从A->B
i最大为num,且i*S<=∑si
以B-A为关键字降序排一下?
【错的次数】
【反思】
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 1e5; struct abc{
ll a,b,rest,c;
}; int n;
ll S,temp,num,srest,ans;
abc a[N+10]; bool cmp(abc a,abc b)
{
return a.c > b.c;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d%lld",&n,&S);
for (int i = 1;i <= n;i++){
scanf("%lld%lld%lld",&a[i].rest,&a[i].a,&a[i].b);
a[i].c = a[i].b-a[i].a;
temp += a[i].rest*a[i].a;
srest += a[i].rest;
} //获取最多买多少个披萨
ll l = 1,r = 1e10 + 100;
while (l <= r)
{
ll mid = (l+r)>>1;
ll temp = mid*S;
if (temp >= srest)
{
num = mid;
r = mid - 1;
}else
l = mid + 1;
} sort(a+1,a+1+n,cmp);//按照B-A降序排 ans = temp;//一开始全都吃A披萨
//这个num的值可能会很大,你可能不能枚举出来全部。
//在可以的情况下,尽量贪心选。只要B披萨的数目不超过num就可以了
ll temp1 = 0,tnum = 0;//tnum是之前剩余的变成B更优的个数
//temp1是那些变成B之后答案的递增值 ll spe = num*S-srest;//多买的披萨的片数
//S片才能凑够一个B披萨 for (int i = 1;i <= n;i++)
{
//第i个人有一些变成选B披萨 if (a[i].c < 0)//这个人变成B之后答案会减小
{//用spe尽量不让他减小->本来肯定要有一些人从a变成B,现在可以用多余的填,不用让他们变了
//前提是
if (tnum + a[i].rest + spe >= S)//够凑了
{
ll dd = tnum + spe;
if (dd >= S)//不用加就能超过了
{
ans = max(ans,temp + temp1);
}else
{
ll js = S-dd;
ans = max(ans,temp + temp1 + a[i].c*js);
}
temp1 = 0;
break;
}
}
if (tnum + a[i].rest < S)//如果没有超过了1块披萨的量
{
temp1 += a[i].rest*a[i].c;
tnum += a[i].rest;
}else//超过了
{
//这一个人的a->b选了多少个?
temp += temp1;//优先加之前的 ll rr = (a[i].rest + tnum)%S;//剩余的
ll choose = a[i].rest-rr;//之后再加当前的
temp += choose*a[i].c; tnum = rr;//前些轮的剩余变成rr了
temp1 = rr*a[i].c;//temp1变成rr*a[i].c了 ans = max(ans,temp);//取最大值
//显然这个过程中B是肯定够用的
}
}
//temp1 = 1;
//printf("%lld\n",temp1);
if (tnum + spe >= S)//全为正数最后一个剩下的可能还可以和多余的凑出来一个S
{
ans = max(ans,temp + temp1);
} printf("%lld\n",ans);
return 0;
}
【Codeforces Round #437 (Div. 2) C】 Ordering Pizza的更多相关文章
- 【Codeforces Round #437 (Div. 2) A】Between the Offices
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using n ...
- 【Codeforces Round #437 (Div. 2) B】Save the problem!
[链接]h在这里写链接 [题意] 给你一个金额N,和硬币的类型总数M; (完全背包),然后问你组成N的方案数. 使得,用这些硬币组成价值为N的金额的方案数为A; 现在A ...
- 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers
[链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...
- 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes
[题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...
- 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees
[题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...
- 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory
[题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...
- 【Codeforces Round #423 (Div. 2) C】String Reconstruction
[Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...
- 【Codeforces Round #423 (Div. 2) B】Black Square
[Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...
- 【Codeforces Round #423 (Div. 2) A】Restaurant Tables
[Link]:http://codeforces.com/contest/828/problem/A [Description] 有n个组按照时间顺序来餐馆; 每个组由一个人或两个人组成; 每当有一个 ...
随机推荐
- 关于EM的理解
任意浏览器的默认字体高度16px(16像素). 所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的 ...
- SQL事务+异常
BEGIN TRAN BEGIN TRY --这里写代码 --这里写代码 END TRY BEGIN CATCH ROLLBACK TRAN END CATCH COMMIT TRAN
- yum---rpm软件包管理器
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性 ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
- hdu5400Arithmetic Sequence
//一个序列,两个公差d1,d2 //问有多少个区间使得这个区间存在一个点,它的左边是公差为d1的序列 //它的右边是公差为d2的序列 //直接存入每一个点向左和向右延伸的公差长度,乘一下即可 //还 ...
- 深入理解javascript之原型
理解原型 原型是一个对象.其它对象能够通过它实现属性继承. 不论什么一个对象都能够成为继承,全部对象在默认的情况下都有一个原型.由于原型本身也是对象,所以每一个原型自身又有一个原型. 不论什么一个对象 ...
- InstallShield详细制作说明(二)
四.设置安装的组件Component
- BZOJ1396: 识别子串(后缀自动机,线段树)
Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...
- [React] Render Text Only Components in React 16
In this session we create a comment component to explore how to create components that only render t ...
- 117.C语言实现桌面输出图片,桌面输出文字,桌面画线
通过获取窗口句柄,然后获取窗口DC,然后画图 #include <Windows.h> #include <stdio.h> //桌面画线 void drawLine() { ...