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代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #define pii pair<int, int>
  6. #define mp(a, b) make_pair(a, b)
  7. #define fr first
  8. #define sc second
  9. const int Maxn = 2005;
  10. std::vector<std::pii>ans;
  11. int a[Maxn];
  12. bool vis[Maxn];
  13. bool check(int t, int n) {
  14. ans.clear();
  15. ans.push_back(std::mp(t, 0));
  16. memset (vis, 0, sizeof vis);
  17. int cur = n;
  18. while (cur > 0) {
  19. int pos_1 = -1;
  20. for (int i = n - 1; i >= 0; i--) {
  21. if (!vis[i]) {
  22. pos_1 = i;
  23. vis[pos_1] = true;
  24. break;
  25. }
  26. }
  27. int pos_2 = (int)(std::lower_bound(a, a + n, t - a[pos_1]) - a);
  28. while (pos_2 < n && vis[pos_2]) {
  29. pos_2++;
  30. }
  31. if (pos_2 == n || a[pos_1] + a[pos_2] != t || vis[pos_2]) {
  32. return false;
  33. }
  34. vis[pos_2] = true;
  35. t = a[pos_1];
  36. cur -= 2;
  37. ans.push_back(std::mp(a[pos_1], a[pos_2]));
  38. }
  39. return true;
  40. }
  41. void solve() {
  42. int n;
  43. scanf("%d", &n);
  44. for (int i = 0; i < 2 * n; i++) {
  45. scanf("%d", &a[i]);
  46. }
  47. std::sort (a, a + 2 * n);
  48. bool flag = false;
  49. for (int i = 0; i + 1 < 2 * n; i++) {
  50. int t = a[i] + a[2 * n - 1];
  51. flag = check(t, 2 * n);
  52. if (flag) {
  53. break;
  54. }
  55. }
  56. if (!flag) {
  57. printf("NO\n");
  58. } else {
  59. printf("YES\n%d\n", ans[0].fr);
  60. for (int i = 1; i < ans.size(); i++) {
  61. printf("%d %d\n", ans[i].fr, ans[i].sc);
  62. }
  63. }
  64. }
  65. int main() {
  66. int T;
  67. scanf("%d", &T);
  68. while(T--) {
  69. solve();
  70. }
  71. return 0;
  72. }

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. 【MySQL】centos6中/etc/init.d/下没有mysqld启动文件,怎么办

    如果/etc/init.d/下面没有mysqld的话,service mysqld start也是不好使的,同样,chkconfig mysqld on也是不能用 解决办法: 将mysql的mysql ...

  2. 基于.net5 wtm框架、uni-app微信公众号开发一、公众号授权

    前端公众号授权 公众号设置 0.首先用IIS创建一个空目录的网站用于公众号域名验证,接着把该网站内网穿透出去,推荐用utools工具,官网:https://u.tools/ 下载安装好后搜索内网穿透并 ...

  3. 1.2V升3.3V芯片,大电流,应用MCU供电,3.3V稳压源

    MCU供电一般是2.5V-5V之间等等都有,1.2V需要升到3.3V的升压芯片来稳压输出3.3V给MCU供电. 同时1.2V的输入电压低,说明供电端的能量也是属于低能量的,对于芯片自身供货是也要求高. ...

  4. STM32驱动LCD实战

    前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...

  5. 生僻标签 fieldset 与 legend 的妙用

    谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...

  6. 数据分析——Numpy/pandas

    NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准数学函数(无需编 ...

  7. k8s之共享存储概述以及演示

    共享存储机制 k8s对有状态的容器应用或者需要对数据进行持久化的应用,在之前的篇章说过,可以将容器内的目录挂载到宿主机的容器目录或者emptyDir临时存储卷. 另外,k8s还开放了两个资源,分别是P ...

  8. JVM(三)从JVM源码角度看类加载器层级关系和双亲委派

    类加载器我们都知道有如下的继承结构,这个关系只是逻辑上的父子关系. 我们一直听说引导类加载器没有实体,为什么没有实体呢? 因为引导类加载器只是一段C++代码并不是什么实体类,所谓的引导类加载器就是那一 ...

  9. Any race is a bug. When there is a race, the compiler is free to do whatever it wants.

    https://mp.weixin.qq.com/s/pVJiFdDDKVx707eKL19bjA 谈谈 Golang 中的 Data Race 原创 ms2008 poslua 2019-05-13 ...

  10. 竞态条件 race condition data race

    竞态条件 race condition Race condition - Wikipedia https://en.wikipedia.org/wiki/Race_condition A race c ...