题目链接

题意:

给出一个2n个数的序列,一开始你可以任选一个x值,然后在序列中找到两个数,使得这两个数的和等于x。然后删除这两个数,并让x等于这两个数中的最大值。直到整个序列全部被删除为止。
问:求一个初始的x值,使序列能被完全删除。如果不能被完全删除,输出NO。

思路:

因为每次操作进行完后,x都会等于删除的两个数中的最大值。因此为了能够将所有数删除,每次删除的一对数中必然包含着当前序列中的最大值。

所以每次我们都需要用到当前序列中最大的数值,因为如果你不用后面将无法再用到这样,就存在没有消掉的数.这样我们每一次取的数一定有序列中的最大数,另一个数可以随便选但是需要判断后面是否满足条件.

这样的话我们就需要维护并且判断每次的x是否可行,并且能够快速找到(sum-最大值)是否存在. 存在更新sum继续,不存在就不可行.

这个地方需要用到multiset.可以快速找到,删除元素.

#include <set>
#include <map>
#include <queue>
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=998244353;
const int MOD=10007;inline int read() {int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}/*
vector<ll> m1;
vector<ll> m2;
priority_queue<ll , vector<ll> , greater<ll> > mn;//上  小根堆        小到大
priority_queue<ll , vector<ll> , less<ll> > mx;//下    大根堆     大到小
*/
map<ll,ll>mp;
map<ll,ll>mpp;
multiset<ll> s,t;
vector<ll> ans;
ll n,m,u,d,r,l;
ll a[maxn];
bool check1(ll sum){ans.clear();t=s;multiset<ll>::iterator it1,it2;while(!t.empty()){it1=t.end();it1--;ll now=*it1;t.erase(it1);it2=t.find(sum-now);if(it2!=t.end()){t.erase(it2);ans.push_back(now);ans.push_back(sum-now);sum=max(now,sum-now);}else return 0;}return 1;
}#define read read()
int main() {ll t;cin>>t;while(t--) {cin>>n;n=n*2;s.clear();for(int i = 1;i<=n;i++){cin>>a[i];s.insert(a[i]);}sort(a+1,a+1+n);bool flag=0;for(int i=n-1;i>=1;i--){if( check1(a[i]+a[n]) ){flag=1;   break;}}if(flag){printf("YES\n");printf("%lld\n",ans[0]+ans[1]);ll size1=ans.size();for(int i=0;i<size1;i+=2){printf("%lld %lld\n",ans[i],ans[i+1]);}}else puts("NO");///}     return 0;
}

Codeforces 1474C.Array Destruction相关推荐

  1. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  2. codeforces 1474 C Array Destruction

    原题链接 题意 首先找一个x=a[i]+a[j] (数组中两个数的和) ,然后删掉这两个数,x=max( a[i] , a[j] ),继续从剩余的数中找到 x=a[i]+a[j] -一直重复这个过程, ...

  3. CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数组 aaa,下标从 000 开始,每次操作分为两个步骤: 构建出数组 bbb,有 bi=gcd(ai,a(i+1)modn)b_i=gcd(a ...

  4. Codeforces 911F Tree Destruction

    Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...

  5. 网络流(最大流):CodeForces 499E Array and Operations

    You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...

  6. CF1474C Array Destruction

    https://codeforces.com/problemset/problem/1474/C 一些芝士:set/multiset可以自动排序 迭代器的下一个或上一个分别用next和prev获取 如 ...

  7. codeforces 1312E. Array Shrinking

    https://codeforces.com/problemset/problem/1312/E 傻逼DP又写了快40分钟,迟早药丸 这题之前总是按传统的区间dp想维护i,j的最多合并次数,怎么维护左 ...

  8. CodeForces - 1454F Array Partition(线段树+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求求出任意一组 x , y , z,满足下列条件: x + y + z = n max( 1 , x ) = min( x + 1 , ...

  9. CodeForces - 1312E Array Shrinking(区间dp)

    题目链接:点击查看 题目大意:给出 n 个数,现在可执行的操作是: 找到相邻且数值相等的两个数,即 abs( i - j ) == 1 && a[ i ] == a[ j ] 使得两个 ...

最新文章

  1. 基于 CNN 的验证码破解实战项目
  2. WebApi发送HTML表单数据:文件上传与多部分MIME
  3. 离开时自动提示设为首页
  4. C++ BUILDER 消息处理的深入探索
  5. 选择排序(C++版)
  6. 如何判断一个字符串的编码类型?
  7. 什么是闭合GOP和开放GOP?
  8. asp服务器组件安装包,ASP服务器组件
  9. MYSQL BENCHMARK函数的使用
  10. 速围观!云+X 案例评选榜单重磅出炉!
  11. Bare HTTP不完全是RESTful
  12. [转载] python 字符串包含某个字符_python字符串
  13. Java整形位运算避免精度缺失,浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源...
  14. 电脑PC端如何下载B站视频?
  15. Chrome和360浏览器“无法翻译此网页”解决方法
  16. 华为云买网站买另外服务器,华为云网站在买其他服务器
  17. RK3066查看和修改CPU频率
  18. Cisco交换机密码修复
  19. android自动切换暗色,根据环境光亮度自动切换,让 Android 10 的暗色主题更智能:Auto Dark Theme...
  20. GitHub学习总结

热门文章

  1. web前端培训需要学多久
  2. 好用的vscode插件【持续更新】
  3. 计算机组装与维护----第三次作业
  4. unity跑酷怎么添加金币_超级酱跑酷:SUPER UNITYCHAN RUN修改金币方法
  5. 手写简易WEB服务器
  6. SLAM--ORB特征点提取--啰里啰嗦的代码解析
  7. 如何搭建个人博客平台
  8. 电脑书籍下载网站集锦
  9. 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?
  10. 物美价廉:读书郎爆款学习机竟然这么值?家长快来抄作业!