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

令 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. std::function 使用_

    #include <iostream> #include <functional> //函数指针写法 typedef int(*FuncPoint)(const int& ...

  2. [poj 1533]最长上升子序列nlogn树状数组

    题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp, ...

  3. Betsy Ross Problem

    Matlab学习中的betsy ross 问题.用matlab函数画1777年的美国国旗. 五角星绘制部分是自己想出来的方法去画上的.具体代码参考如下. 先是绘制矩形的函数 function Draw ...

  4. 利用Azure Media Services Explorer发布VOD视频

    1.连接Media Services账号, 填入Media Services的账号以及Account Key 如果使用中国的Azure的话,需要在Endpoint节上更改一下,因为国内的Azure的接 ...

  5. Docker集群管理Swarm数据持久化

    一.前言 和docker容器一样,Swarm集群中运行的服务也能够做数据持久化.我们可以通过volume.bind和nfs等方式来实现swarm集群应用数据的持久化.其实和docker数据持久化的形式 ...

  6. caffe 配置文件详解

    主要是遇坑了,要记录一下. solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --s ...

  7. Java操作Kafka执行不成功的解决方法,Kafka Broker Advertised.Listeners属性的设置

    创建Spring Boot项目继承Kafka,向Kafka发送消息始终不成功.具体项目配置如下: <?xml version="1.0" encoding="UTF ...

  8. 项目Header组件的开发注意事项

    npm install stylus --save npm install stylus-loader --save 移动端一般采用rem布局方式 Header组件里iconfont的使用和代码优化: ...

  9. linux服务器上修改oracle数据库的字符集

    linux服务器上以dba身份进入:sqlplus / as sysdba; 依次执行以下命令:shutdown immediate; startup mount; alter system enab ...

  10. c# 的一些基本操作或属性

    http下载文件,不保存到服务器,直接使用浏览器下载 /// <summary> /// 根据url下载文件 /// </summary> /// <param name ...