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

Election of the King 2023牛客暑期多校训练营4-F

登录—专业IT笔试面试备考平台_牛客网

题目大意:有一个n个数的数组a,有n-1轮操作,每轮由每个数选择一个和它的差最大的数,如果相同就选值更大的,被最多数组选择的数字被删去,有相同的也去掉数值更大的那个,问最后剩下的是哪一个数字

1<=n<=1e6;1<=ai<=1e9

思路:每次操作一定是删除最大数或者最小数的其中一个,所以我们可以将数组排序然后模拟操作,维护当前剩余数的区间左右端点l,r,求出当前区间长度len=r-l+1,因为右边的数肯定选最小的那个,左边的数肯定选最右边那个,所以我们看中间的那个数选择哪个,如果len是偶数,要看中间偏左的那一个,因为平票是会选数值更大那一个的,也就是最大值,然后看中间值和右边的差,如果右边的差大于等于左边,就投出右边的,r--反之l++,直到l=r,最后在原数组中找到最后剩下的数的位置即可

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
int a[N];
int b[N];
int main()
{int n;cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];b[i] = a[i];//保留原数组}sort(a + 1, a + n + 1);int l = 1, r = n;while (l < r){int len = r - l + 1;int pos = len / 2 + l;if (len % 2 == 0)pos--;//偶数时要选左边的if (a[r] - a[pos] >= a[pos] - a[l]){//右边差大于左边或者平票都是投出最右边的r--;}elsel++;}for (int i = 1; i <= n; i++){if (b[i] == a[l])//在原数组中找到最后剩下的数{cout << i << endl;break;}}return 0;
}

http://www.lryc.cn/news/102199.html

相关文章:

  • Nacos的搭建及服务调用
  • uniapp小程序自定义loding,通过状态管理配置全局使用
  • leetcode 45. 跳跃游戏 II
  • 力扣热门100题之矩阵置0【中等】
  • 【机器学习】Classification using Logistic Regression
  • 全方位支持图文和音视频、100+增强功能,Facebook开源数据增强库AugLy
  • RxSwift 使用方式
  • HTML5 Web Worker
  • 25.9 matlab里面的10中优化方法介绍—— 惩罚函数法求约束最优化问题(matlab程序)
  • django channels实战(websocket底层原理和案例)
  • 学习使用axios,绑定动态数据
  • c语言内存函数的深度解析
  • 低代码平台介绍(国内常见的)
  • matlab RRR机械臂 简略代码
  • 集成测试,单元测试隔离 maven-surefire-plugin
  • 渗透测试基础知识(1)
  • Android NDK开发
  • 使用python爬取淘宝商品信息
  • QEMU源码全解析18 —— QOM介绍(7)
  • 【华为OD机试】 选修课
  • 225. 用队列实现栈
  • IDEA将本地项目上传到码云
  • Ubuntu更改虚拟机网段(改成桥接模式无法连接网络)
  • 谷粒商城第七天-商品服务之分类管理下的删除、新增以及修改商品分类
  • Redis学习路线(1)—— Redis的安装
  • 《MySQL 实战 45 讲》课程学习笔记(五)
  • 使用GADL对高程数据进行填洼
  • Spring Boot集成Swagger3.0,Knife4j导出文档
  • 在.NET Framework中的连接字符串ConnectionStrings属性
  • kafka消费报错卡死:内存溢出OutOfMemoryError: Java heap space