CF1474-C. Array Destruction
CF1474-C. Array Destruction
题意:
题目给出一个长度为\(2n\)的正整数序列,现在问你是否存在一个\(x\)使得可以不断的进行如下操作,直到这个序列变为空:
从序列中找到两个数字\(a_1,a_2\),使得\(a_1+a_2==x\),然后从序列中删掉这两个数字,\(x\)的值也被更新,\(x=max(a_1, a+2)\)。
题解:
由于这道题给的数据范围较小\(n\leqslant1000\),所以可以通过暴力枚举\(x\)来得到答案。
当然这里暴力枚举\(x\)也有一定的技巧。先说结论,这个最开始的\(x\)一定等于序列中最大的一个数字\(a_{max}\)加上序列中的另外一个数字\(a_i\),原因如下:
假设\(x\not=a_{max}+a_i\),也就是说\(x=a_{i_1}+a_{i_2}, max\{a_{i_1},a_{i_2}\}<a_{max}\),那么当从序列中找到了\(a_{i_1},a_{i_2}\)之后\(x\)就被更新为\(x=max\{a_{i_1},a_{i_2}\}\),这个时候\(a_{max}\)是大于\(x\)的,\(x\)不可能在这之后加上一个正整数之后等于\(a_{max}\),因为这之后,\(x\)一直保持递减的状态。
由此,\(x\)枚举的值可以为\(a_{max}+a_{i},1\leqslant i\leqslant n-1\),对于每个枚举的\(x\):
每次找到序列中的最大值\(a_{max}\)然后二分搜索\(x-a_{max}\),删掉这两个数字,然后更新\(x\)... ...如果每次都能找到\(x-a_{max}\)这个值并最终将整个序列删掉,那么这个\(x\)就是答案,如果全部\(x\)枚举完都没有答案,那么就不存在。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define pii pair<int, int>
#define mp(a, b) make_pair(a, b)
#define fr first
#define sc second
const int Maxn = 2005;
std::vector<std::pii>ans;
int a[Maxn];
bool vis[Maxn];
bool check(int t, int n) {
ans.clear();
ans.push_back(std::mp(t, 0));
memset (vis, 0, sizeof vis);
int cur = n;
while (cur > 0) {
int pos_1 = -1;
for (int i = n - 1; i >= 0; i--) {
if (!vis[i]) {
pos_1 = i;
vis[pos_1] = true;
break;
}
}
int pos_2 = (int)(std::lower_bound(a, a + n, t - a[pos_1]) - a);
while (pos_2 < n && vis[pos_2]) {
pos_2++;
}
if (pos_2 == n || a[pos_1] + a[pos_2] != t || vis[pos_2]) {
return false;
}
vis[pos_2] = true;
t = a[pos_1];
cur -= 2;
ans.push_back(std::mp(a[pos_1], a[pos_2]));
}
return true;
}
void solve() {
int n;
scanf("%d", &n);
for (int i = 0; i < 2 * n; i++) {
scanf("%d", &a[i]);
}
std::sort (a, a + 2 * n);
bool flag = false;
for (int i = 0; i + 1 < 2 * n; i++) {
int t = a[i] + a[2 * n - 1];
flag = check(t, 2 * n);
if (flag) {
break;
}
}
if (!flag) {
printf("NO\n");
} else {
printf("YES\n%d\n", ans[0].fr);
for (int i = 1; i < ans.size(); i++) {
printf("%d %d\n", ans[i].fr, ans[i].sc);
}
}
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
solve();
}
return 0;
}
CF1474-C. Array Destruction的更多相关文章
- Codeforces Round #696 (Div. 2) C. Array Destruction (贪心,multiset)
题意:有\(n\)个数,首先任选一个正整数\(x\),然后在数组中找到两个和为\(x\)的数,然后去掉这两个数,\(x\)更新为两个数中较大的那个.问你最后时候能把所有数都去掉,如果能,输出最初的\( ...
- ES6新特性概览
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- ES6 主要的新特性
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况
ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...
- ES6之路
从工作到现在,虽然是PHP出身,一直都和JS形影不离,从JQ和原生处理页面,到后来被angular1的MVVM模式惊艳到,再到弃angular转战vue,到现在使用react,一路走来,跳坑无数,现在 ...
- Array.prototype.map()和Array.prototypefilter()
ES5 => 筛选功能 Array.prototypefilter(): 代码: var words = ['spray', 'limit', 'elite', 'exuberant', 'd ...
- HDU 5653 Bomber Man wants to bomb an Array. dp
Bomber Man wants to bomb an Array. 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5653 Description ...
- hdu-5653 Bomber Man wants to bomb an Array.(区间dp)
题目链接: Bomber Man wants to bomb an Array. Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65 ...
- javascript常用方法 - Array
//1.Aarry方法 // 1.1 Array.from(arrayLike[, mapFn[, thisArg]]) // @arrayLike 想要转换成数组的伪数组对象或可迭代对象. // @ ...
随机推荐
- 环境变量IFS
环境变量IFS的值是由1个空格.1个制表符.1个换行符依序构成的字符串,也就是" \t\n"字符串. #查看IFS变量值的长度: test ~ # expr length &quo ...
- SVM 支持向量机算法-原理篇
公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...
- MySQL全面瓦解18:自定义函数
定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...
- 安装python性能检测工具line_profiler
line_profiler是一款监测python的CPU密集型性能问题的强大工具,可以对函数进行逐行分析,在linux上安装时一切正常,然而今天在win10 64位系统安装失败了 pip3 insta ...
- 多视图子空间聚类/表示学习(Multi-view Subspace Clustering/Representation Learning)
多视图子空间聚类/表示学习(Multi-view Subspace Clustering/Representation Learning) 作者:凯鲁嘎吉 - 博客园 http://www.cnblo ...
- 2021 Duilib最新入门教程(一)Duilib简介
目录 Duilib解决什么问题? 方案一.自己画界面 方案二.使用标准控件 方案三.使用Duilib框架 Duilib是什么? 先看下Duilib官方简介 再看下DirectUI 百度百科 比起介 ...
- [noip模拟]分组行动
题目描述 最近,木木中学要举行一年一度的辩论赛了,我们活泼开朗乐观向上不寂寞不生病不挂科天天回家吃饭的新时代好少年--飞飞,自然是热情参与咯!辩论嘛,就有正方和反方两个组,这是一个传统项目,所以,包括 ...
- JVM(二)类加载的时机及其过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的的整个生命周期包括: 加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化 ...
- 初识JavaScript和jQuery
JavaScript 1.特性 ①脚本语言.JavaScript是一种解释型的脚本语言,C.C++.Java等语言先编译后执行, 而JavaScript是在程序的运行过程中逐行进行解释. ②基于对象. ...
- 在Centos7上安装Python+Selenium+Chrome+Chromedriver
1.下载Chrome 上一篇文章已经演示过了Python+Selenium+Firefox+Geckodriver安装步骤并通过自动化脚本打开百度 因此当前只需要安装Chrome和Chromedriv ...