当前位置: 首页 > news >正文

CF 965 C. Perform Operations to Maximize Score

原题链接:Problem - C - Codeforces

题意:多测,每次给出n和k,n代表长度为n的数组,每个数有二个属性,第一个是本身的值,第二个是这个数是否能被修改,如果能被修改那么就可以让k减去1让数的值增加1,可以从数组里面随意拿出一个数,对于剩下的数求出中位数,问拿出来的数和中位数的和的最大值是多少?

思路:贪心+二分,可以观察到最终的答案构成是拿出的数和中位数组成的,那么就只有二种情况,第一种是让拿出来的数变大,第二种是让中位数变大,不存在都变大的情况,因为花费1代价不一定可以让中位数变大,但是一定可以让拿出来的数变大。

第一种情况,就是当数可以被改变的时候,就去让这个数最大,并且拿出去,然后加上中位数就可以了。可以观察到,如果n是奇数,那么那中位数前面的数,不会改变中位数,拿中位数及其后面的数,会让中位数往前推一个。如果n是偶数,那么那中位数及其前面的数,会让中位数往后推一个,拿中位数及其后面的数,不会改变中位数。

第二种情况,直接将最大的数拿走,然后二分的求出中位数即可。因为如果要改变中位数,假定k无穷,并且所有的数都可以被改变,那么一定会用k来增加中位数及其之后的数,这些数最后一定是相等的,如果不将最大值拿走,那么到达相等的阶段要花费更多的代价。

最后二种答案取最值。

//冷静,冷静,冷静
//调不出来就重构
//#pragma GCC optimize(2)
//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=1000000007;
struct node
{ll a,b;
}p[N];
bool cmp(node &a,node &b)
{return a.a<b.a;
} 
ll n;
bool is(ll x,ll k)
{ll sum=0;for(int i=n-2;i>=0;i--){if(p[i].a>=x)sum++;else {if(p[i].a+k>=x&&p[i].b){sum++;k=k-(x-p[i].a);}else sum--;}}return sum>0;
}
ll solve(ll k)
{ll l=0,r=1e9+10;while(l+1<r){ll mid=l+r>>1;if(is(mid,k))l=mid;else r=mid;}if(is(r,k))l=r;return l;
}
void Jiuyuan()
{ll k;cin>>n>>k;for(int i=0;i<n;i++)cin>>p[i].a;for(int i=0;i<n;i++)cin>>p[i].b;ll ans=0;sort(p,p+n,cmp);for(int i=0;i<n;i++){if(p[i].b){if(n&1){if(i<(n-1)/2)ans=max(ans,p[i].a+k+p[(n-1)/2].a);else ans=max(ans,p[i].a+k+p[(n-1)/2-1].a);}else{if(i>(n-1)/2)ans=max(ans,p[i].a+k+p[(n-1)/2].a);else ans=max(ans,p[i].a+k+p[(n-1)/2+1].a);}}}ans=max(ans,solve(k)+p[n-1].a);cout<<ans<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);ll T=1;cin>>T;while(T--){Jiuyuan();}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习从入门到精通——大模型认知理解
  • vue.js的设计与实现(响应系统1)
  • 【嵌入式】总结指南——Linux下的裸机驱动开发
  • docker的安装+docker镜像的基本操作
  • 浅谈垃圾回收机制
  • Python实现贪心算法
  • Python3:多行文本内容转换为标准的cURL请求参数值
  • UDP+TCP
  • leetcode242:有效的字母异位词
  • 【精选】基于协同过滤算法的小说推荐系统(定制参考分享)
  • 【51单片机】ds18b20驱动,11.0592MHZ,使用DS18b20
  • 【运维】linux使用systemd手动部署与管理服务进程,以webhook回调告警为例(附常用linux进程/端口状况查看命令)
  • C#发邮件时如何确保邮件内容的安全和隐私?
  • 猫用空气净化器好不好?养猫推荐宠物空气净化器品牌
  • uniapp点击预览图片,两种效果
  • canvas 高仿 Apple Watch 表盘
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • gf框架之分页模块(五) - 自定义分页
  • iOS 系统授权开发
  • PHP的类修饰符与访问修饰符
  • socket.io+express实现聊天室的思考(三)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • webpack项目中使用grunt监听文件变动自动打包编译
  • WebSocket使用
  • windows下如何用phpstorm同步测试服务器
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 程序员该如何有效的找工作?
  • 从重复到重用
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何优雅地使用 Sublime Text
  • 深度解析利用ES6进行Promise封装总结
  • hi-nginx-1.3.4编译安装
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​什么是bug?bug的源头在哪里?
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (10)STL算法之搜索(二) 二分查找
  • (2)MFC+openGL单文档框架glFrame
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三) diretfbrc详解
  • (三)SvelteKit教程:layout 文件
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • ***通过什么方式***网吧
  • .NET Micro Framework初体验(二)
  • .net 按比例显示图片的缩略图
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net7 环境安装配置
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .net操作Excel出错解决
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Bean注解详解