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的更多相关文章

  1. Codeforces Round #696 (Div. 2) C. Array Destruction (贪心,multiset)

    题意:有\(n\)个数,首先任选一个正整数\(x\),然后在数组中找到两个和为\(x\)的数,然后去掉这两个数,\(x\)更新为两个数中较大的那个.问你最后时候能把所有数都去掉,如果能,输出最初的\( ...

  2. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  3. ES6 主要的新特性

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  4. ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况

    ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...

  5. ES6之路

    从工作到现在,虽然是PHP出身,一直都和JS形影不离,从JQ和原生处理页面,到后来被angular1的MVVM模式惊艳到,再到弃angular转战vue,到现在使用react,一路走来,跳坑无数,现在 ...

  6. Array.prototype.map()和Array.prototypefilter()

    ES5 => 筛选功能  Array.prototypefilter(): 代码: var words = ['spray', 'limit', 'elite', 'exuberant', 'd ...

  7. 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 ...

  8. 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 ...

  9. javascript常用方法 - Array

    //1.Aarry方法 // 1.1 Array.from(arrayLike[, mapFn[, thisArg]]) // @arrayLike 想要转换成数组的伪数组对象或可迭代对象. // @ ...

随机推荐

  1. 【Oracle】常见等待事件处理

    1.查看数据库中需要关注的等待事件: select sw.seq#,sw.sid||','||s.serial# sids,s.username,sw.event,sw.P1,sw.p2,sw.p3, ...

  2. 转发:[服务器]SSL安装证书教程

    [服务器]SSL安装证书教程   来自阿里云教程 Tomcat服务器安装SSL证书 安装PFX格式证书 https://help.aliyun.com/document_detail/98576.ht ...

  3. 用SAP浏览网页

    在SAP里,通过两个类就可以做一个简单的,嵌入sap里的网页.这两个类就是 1. cl_gui_custom_container 这个类是自定义屏幕里用得,也就是画一个container,在这个容器中 ...

  4. 宝塔的url计划任务

    to通过url访问 就像访问你的网站一样 然后控制器/方法里面写你要做的操作 就可以了 ,简单的一批

  5. 利用容器逃逸实现远程登录k8s集群节点

    某天, 某鱼说要吃瞄, 于是...... 李国宝:边缘计算k8s集群SuperEdge初体验 ​ zhuanlan.zhihu.com 图标 照着上一篇文章来说,我这边边缘计算集群有一堆节点. 每个节 ...

  6. 词嵌入之Word2Vec

    词嵌入要解决什么问题 在自然语言系统中,词被看作最为基本的单元,如何将词进行向量化表示是一个很基本的问题,词嵌入(word embedding)就是把词映射为低维实数域向量的技术. 下面先介绍几种词的 ...

  7. 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726

    1. 特性  支持 1A1C  支持 USB-A 和 TYPE-C 双端口输出  单口输出支持全部快充协议  双口同时插入时降压到 5V  快充规格  集成 QC2.0/QC3.0/QC4/QC4+输 ...

  8. 1.8V转5V电平转换芯片,1.8V转5V的电源芯片

    1.8V是一个比较低的电压,在电压供电电压中,1.8V电压的过于小了,在一些电子模块或者MCU中,无法达到供电电压,和稳压作用,PW5100就是可以在1.8V转5V的电平转换电路和芯片,最大可提供50 ...

  9. 理解Go的多态实现

    总结两点: 在Go中,定义一个interface类型,该类型说明了它有哪些方法.使用时,在函数中,将该interface类型作为函数的形参,任意一个实现了interface类型的实参都能作为该inte ...

  10. 【Android初级】使用TypeFace设置TextView的文字字体(附源码)

    在Android里面设置一个TextView的文字颜色和文字大小,都很简单,也是一个常用的基本功能.但很少有设置文字字体的,今天要分享的是通过TypeFace去设置TextView的文字字体,布局里面 ...