LuoguP1286 两数之和
题面概括
将n个数两两相加得到n*(n-1)/2个和,给出这些和,求所有原数方案
n<=500
LuoguP1286
题解
此题原题是 n<10, 没啥可做的
先将 \(n*(n-1)/2\) 个数排序
设b[i]表示给定的数中第i小的, a[i]为原数第i小的
显然有: b[1]=a[1]+a[2],b[2]=a[1]+a[3]
那么 i>=3 时呢?
则是不一定的
考虑为什么不一定: 我们无法判断 \(b[3] = a[1]+a[4]\) 还是 \(b[4] = a[2]+a[3]\)
那b[3]还可不可能等于其他的组合呢?
显然是不能的(不解释),
b[3]如此,b[4]呢? b[5]呢?
不难发现若 b[j]=a[p]+a[q] 当j确定后 \(q_max=j+1\),此时 p=1
所以我们可以通过枚举p,q(p!=1)来将b[j]删掉,剩下的数就一定是 a[1]+a[j+1]=b[j]
枚举a[1]则可以轻松推出剩下的数
删除操作用 multiset 实现,格外好写
代码
#include<bits/stdc++.h>
using namespace std;
#define int ll
#define re register
#define ll long long
#define get getchar()
#define in inline
in int read()
{
int t=0; char ch=get;
while(ch<'0' || ch>'9') ch=get;
while(ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
return t;
}
const int _=601;
multiset<int > s;
int n,b[_<<10],a[_],f[_],N,st,ans[_][_],tot;
in void solve(int k)
{
a[1]=(b[2]+b[1]-b[k])/2;
a[2]=b[1]-a[1];
a[3]=b[k]-a[2];
}
void calc(int qwe)
{
for(re int i=4;i<=n;i++)
{
multiset<int> :: iterator it=s.begin();
a[i]=*it-a[1];
s.erase(it);
if(a[i]<a[i-1]) return;
for(re int j=2;j<i;j++)
{
it=s.find(a[i]+a[j]);
if(*it!=a[i]+a[j]) return;
s.erase(it);
}
}
tot++;
for(re int i=1;i<=n;i++) { ans[tot][i]=a[i]; }
f[qwe]=1;
}
signed main()
{
while(cin>>n)
{
memset(f,0,sizeof(f));
memset(ans,0,sizeof(ans));
s.clear();
tot=0;
N=(n-1)*n/2;
for(re int i=1;i<=N;i++) b[i]=read();
sort(b+1,b+N+1);
for(re int i=3;i<=N && b[2]+b[1]>=b[i];i++)
{
if((b[2]+b[1]-b[i])&1) continue;
if(b[i]==b[i-1]&&f[i-1]) {f[i]=1;continue;}
solve(i);
if(a[3]<a[2] || a[2]<a[1]) continue;
s.clear();
for(re int j=3;j<=N;j++)
if(j!=i) s.insert(b[j]);
calc(i);
}
if(tot==0) {
cout<<"Impossible"<<endl;
continue;
}
for(re int i=tot;i>=1;i--){
for(re int j=1;j<=n;j++) cout<<ans[i][j]<<' ';
cout<<endl;
}
}
return 0;
}
LuoguP1286 两数之和的更多相关文章
- 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...
- LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- LeetCode 371. Sum of Two Integers (两数之和)
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...
- LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- [LeetCode] 1. Two Sum 两数之和
Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...
- Leetcode(一)两数之和
1.两数之和 题目要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重 ...
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- 两数之和,两数相加(leetcode)
我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...
随机推荐
- Spring Boot 第一弹,问候一下世界!!!
持续原创输出,点击上方蓝字关注我吧 目录 前言 什么是Spring Boot? 如何搭建一个Spring Boot项目? 第一个程序 Hello World 依赖解读 什么是配置文件? 什么是启动类? ...
- Vue 分支循环
分支循环 在Vue中,分支循环也是使用标签属性指令完成的,这一点与后端模板语法不太相同. v-for 下面是通过v-for进行循环,不光可以拿到元素本身,也可以拿到索引值. 如果数据是对象类型,则可以 ...
- jdbc原理与步骤
jdbc原理 1.加载JDBC驱动,并将其注册到DriverManager 2.建立数据库连接,获取connection对象 3.建立Statement对象或PreparedStatement对象 4 ...
- PHP代码审计02之filter_var()函数缺陷
前言 根据红日安全写的文章,学习PHP代码审计审计的第二节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会有一道CTF题目来进行巩固,外加一个实例来深入分析,想了 ...
- c++ 中. 和 ->,波浪号 ~ 符号怎么用 ————很重要
参考:https://www.cnblogs.com/Simulation-Campus/p/8809999.html 1. 用在类中的析构函数之前,表示该函数是析构函数.如类A的析构函数 clas ...
- matlab find函数使用语法
find 找到非零元素的索引和值 语法: 1. ind = find(X) 2. ind = find(X, k) 3. ind = find(X, k, 'first') 4. ind = find ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期
写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...
- Linux软件漏洞-1
RHSA-2018:3107-中危: wpa_supplicant 安全和BUG修复更新 漏洞编号:CVE-2018-14526 漏洞公告:wpa_supplicant中未经身份验证的EAPOL-Ke ...
- php正则偷电影
1.是将电影网站弄到自己的phpstudy下面,然后进行获取电影的一些数据,然后将其存到数据库,不要获取别人网站的数据,不然会导致网站的崩溃.
- cocos creator屏幕适配的一些知识点
一. cocos creator 提供的几种适配策略 EXACT_FIT: 整个应用程序在指定区域可见,无需尝试保留原始纵横比.可能会出现失真,应用程序会被拉伸或压缩.也就是说设计分辨率的长和宽不会等 ...