这个题。。 刚开始没看见输入若干行,所以有的点就。。

令 m = n * (n - 1) / 2

已知 s = {s (1), s(2), ..., s(m)},

s(i) <= s(i+1)

那么

最小是 s1=x1+x2,

其次是 s2=x1+x3,

则有 sp=x2+x3

联立解得:(s1 + s2 + sp) / 2 - sp = x1

s[]=s-{x1+x2, x1+x3, x2+x3}

也就是将s[]中的求得的点打上标记

x1 + x4 = min{s},求出x4

s = s - {x1 + x4, x2 + x4, x3 + x4}

也是将能求出的点打上标记

x1+x5=min{s}... (以此类推)

另外需要判断常数列:

1.如果是奇数列,就无解,输出Impossible

2.如果是偶数列,就输出n个,s[1] / 2。

处理的话用了一下二分,找第一个不小于k的位置

我没用搜索,通过上面的解析,放到循环中就好了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 310;
const int maxm = maxn * (maxn-1) / 2; int n,m,x[maxn],s[maxm];
int cnt,ans[2][maxn];
bool vis[maxm];
int flag=1; int erf(int k){
//找不小于k的最小值
int l = 0 , r = m + 1 , ans , mid;
while(r > l + 1){
mid = (l + r) / 2;
if(s[mid] < k) ans = l = mid;
else r = mid;
}
return ans + 1;
} void find(int p){
memset(vis,false,sizeof(vis));
vis[1] = vis[2] = vis[p] = true;
x[1] = (s[1] + s[2] + s[p]) / 2 - s[p];
x[2] = s[1] - x[1];
x[3] = s[2] - x[1];
int next = 3;
for(int i=4;i<=n;i++){
while(next < m && vis[next])
next++;
//if(next > m) return;
x[i] = s[next] - x[1];
vis[next] = true;
for(int j=2;j<i;j++){
if(x[j] > x[i]) return;
int sum = x[i] + x[j];
p = erf(sum);
if(s[p] != sum) return;
bool found = false;
for(int k=p;p<=m && s[k] == s[p];k++){
if(!vis[k]){
found = true;
vis[k] = true;
break;
}
}
if(!found) return;
}
}
for(int i=1;i<=n;i++)
ans[1][i] = x[i];
cnt++;
} int main(){
while(scanf("%d",&n) == 1){
memset(ans,0,sizeof(ans));
memset(x,0,sizeof(x));
flag=1;cnt=0;
m = n * (n - 1) / 2;
for(int i=1;i<=m;i++){
scanf("%d",&s[i]);
if(i>1){
if(s[i]==s[i-1]&&flag==1) flag=1;
else flag=0;
}
}
if(flag){
//printf("1\n");
if(s[1] % 2 == 0){
for(int i=1;i<=n;i++)
printf("%d ",s[i] / 2);
printf("\n");
}
else {
printf("Impossible\n");
}
}
else{
sort(s + 1,s + m + 1 );
for(int i=3;i<=m;i++){
if((s[i] != s[i-1] || i==3) && (s[1] + s[2] + s[i]) % 2 == 0)
find(i);
if(cnt > 0)
break;
}
if(cnt == 0) {
printf("Impossible\n");
}
else {
for(int j=1;j<=n;j++)
printf("%d ",ans[1][j]);
printf("\n");
}
}
}
return 0;
}

洛谷P1286 两数之和的更多相关文章

  1. 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...

  2. LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$

    Design and implement a TwoSum class. It should support the following operations: add and find. add - ...

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

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

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

  6. [LeetCode] 1. Two Sum 两数之和

    Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...

  7. Leetcode(一)两数之和

    1.两数之和 题目要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重 ...

  8. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  9. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

随机推荐

  1. 解题:HEOI 2013 SAO

    题面 不好讲,直接上式子吧=.= 设$dp[i][j]$表示考虑完$i$的子树后$i$的排名为$j$的方案数,然后转移类似树形背包,具体来说是(这里假设子树在$i$后选,其实反过来还用这个式子答案也是 ...

  2. salt源码安装

    salt是什么? 一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, 使其可以用于编配, 远 ...

  3. 网络中,FIFO、LRU、OPT这三种置换算法的缺页次数

    FIFO.LRU.OPT这三种置换算法的缺页次数 转载  由于要考计算机四级网络,这里遇到了问题,就搜了一些资料来解疑. 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3 ...

  4. 经典面试题目C语言

    题一,堆和栈的区别是? 题二,Volatile与Register的区别是? 题三,ARM里的大端格式和小端格式分别是什么意思? 题一答案:   (1)存储内容不同 栈:在函数调用时,栈中存放的是函数中 ...

  5. AES-NI指令集

    对于intel的AES-NI新指令集,需要i5处理器及以上的相关硬件支持.在编译时,可能会出现 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/wmmintrin. ...

  6. 压缩前端文件(html, css, js)

    1:原因 在写前端代码时, 因为要尽可能的适合阅读会加入许多注释, 空格等, 这些在开发时是必要的, 但当你要发布时, 就需要让代码更加精简, 精简压缩的同时也混淆了代码, 安全性也加强了, 可以说是 ...

  7. Java基础-位运算符Bitwise Operators

    Java基础-位运算符Bitwise Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算特点 位运算符分为按位与(&),按位或(|),按位异或(^ ...

  8. JAVA-JSP动作

    动作元素基本上是预定义的功能.下表列出了可用的JSP动作 - 编号 动作 描述 1 jsp:include 在请求页面时包含一个文件. 2 jsp:useBean 查找或实例化一个JavaBean. ...

  9. Linux根目录解析

    根目录结构如下: 1. / - 根目录: 每一个文件和目录都从这里开始. 只有root用户具有该目录下的写权限.此目录和/root目录不同,/root目录是root用户的主目录. 2. /bin - ...

  10. asp.net后台操作javascript:confirm返回值

    在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. ( ...