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

令 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. mac 使用tree命令

    下载软件包: http://mama.indstate.edu/users/ice/tree/ 安装说明: http://www.qiansw.com/mac-os-x-install-tree-co ...

  2. 单点登录(十七)----cas4.2.x登录mongodb验证方式成功后返回更多信息更多属性到客户端

    我们在之前已经完成了cas4.2.x登录使用mongodb验证方式登录成功了.也解决了登录名中使用中文乱码的问题. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方 ...

  3. Luogu 1063 能量项链(动态规划)

    Luogu 1063 能量项链(动态规划) Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某 ...

  4. 菜鸟合作伙伴日志接入规范之C#实现

    由于行业的业务功能需要,需要与菜鸟对接登录日志,将我们系统的用户登录信息提交给菜鸟,菜鸟分析通过分析日志,检查存在的一些安全问题.根据菜鸟提供的标准,实现了C#的接入,下面分享给大家,让需要的朋友少走 ...

  5. 【DSU on tree】【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    Description 给定一棵 \(n\) 个节点的树,每条边上有一个字符,字符集大小 \(22\),求每个节点的子树内最长的简单路径使得路径上的字符经过重排后构成回文串. Limitation \ ...

  6. QT 设置菜单图标

    目录 一.添加主窗口菜单 二.添加菜单图标 三.添加资源文件 四.使用资源文件 五.使用代码来添加菜单和图标     正文 一.添加主窗口菜单 1.新建Qt Gui应用,项目名称为myMainWind ...

  7. bzoj千题计划160:bzoj2599: [IOI2011]Race

    http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...

  8. HDU 2814 斐波那契循环节 欧拉降幂

    一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...

  9. angularJS 控制输入的百分数在0%-100%之间

    想了老半天了,记录一下 app.directive("percentageCheck", function () { return { restrict: 'A', require ...

  10. 重新找回spyder3-editor 里的code completion

    升级到spyder3之后, 突然丢失了code autocompletion在editor context里. 觉得太不爽了. 虽然在ipython窗格里TAB键的自动完成功能依然完好. 仔细观察 T ...