CodeForces 363D 【二分+贪心】
2024-09-04 18:45:06
思路:
一开始是没有办法贪心的,但是答案是可以二分的,因为窝能买k辆车的话,窝就一定能买k-1辆车;而且我最好就是拿手上钱较多的那些人去买价格便宜的车,这样肯定是能买到最多的车,而且花的少,因为对于要买的车公共钱的话够得话,那就直接公共钱付了就行,而要付出的钱是一定要付的。
所以直接二分答案。
然后人的总花费=最有钱的那些人去买最便宜的那些车的情况;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f; const int N=1e5+10; LL b[N],p[N],a; int main()
{
int n,m;
scanf("%d%d%lld",&n,&m,&a);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=m;i++)
scanf("%lld",&p[i]); sort(b+1,b+n+1);
sort(p+1,p+m+1); int ans=0,cas=100;
int left=0,right=min(n+1,m+1);
while(left<right&&cas--)
{
int mid=(left+right)/2;
LL res=0;
for(int i=1;i<=mid;i++)
{
if(b[n+1-i]<p[mid+1-i]) //最有钱的几个人去买最便宜的车以至于能买到最多数量的车;
res+=(p[mid+1-i]-b[n+1-i]);
}
if(res<=a)
{
left=mid;
ans=mid;
}
else
right=mid;
}
printf("%d",ans);
LL pay_out=0;
for(int i=1;i<=ans;i++)
{
if(b[n+1-i]<=p[ans+1-i])
{
pay_out+=b[n+1-i];
a-=(p[ans+1-i]-b[n+1-i]);
}
else
pay_out+=p[ans+1-i];
}
printf(" %lld",max(0LL,pay_out-a));
return 0;
}
最新文章
- spring笔记--通过注解(annotation)配置Bean
- Smarty单模板多缓存
- hibernate自动生成映射文件
- JavaScript学习心得(五)
- Oracle当前用户SQL
- 关于Spring的BeanPostProcessor
- The Blocks Problem(vector)
- 结合apache安装subversion
- selenium 不同版本Driver
- Salesforce Sales Cloud 零基础学习(四) Chatter
- 2018-12-14 JavaScript实现ZLOGO: 前进方向和速度
- CentOS 安装、配置supervisord
- hdoj:2053
- 【读书笔记】iOS-流式音频与Pandora Radio之路
- git 使用https 和SSH 提交远程库小总结
- Got fatal error 1236 from master when reading data from binary log: &#39;Could not find first log file name in binary log index file&#39;系列三:重置主从同步
- 【NOI2016】区间
- 【8086汇编-Day1】预备知识
- 人生苦短,我用Python!
- 剑指offer——面试题18:删除链表的节点
热门文章
- Linux中ctrl+z 、ctrl+c、 ctrl+d差别
- 通过css选择器class给元素添加cursor的坑
- EasyPusher:基于live555的DarwinInjector实现的RTSP直播推送程序
- [Phoenix] 四、加盐表
- TEdit的创建与显示过程
- 如何强制ffmpeg编码时输出一个关键帧
- java引用问题(—)
- html5--4-4 audio元素/格式的转换
- java IO流文件的读写具体实例(转载)
- ubuntu nginx 安装 certbot(letsencrypt)