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

令 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;
}

最新文章

  1. Redis主-从部署实践
  2. 使用python做科学计算
  3. Oracle_双机备份
  4. 浅谈压缩感知(二十六):压缩感知重构算法之分段弱正交匹配追踪(SWOMP)
  5. app:transformClassesWithJarMergingForDebug uplicate entry: android/support/v4/app/BackStackState$1.class
  6. 在javaEE下学习web(在eclipse中开发动态的WEB工程,servlet的环境搭建,及servlet的一些方法)
  7. PHP学习心得(二)——实用脚本
  8. linux下负载均衡(LVS安装与配置)【转】
  9. 更改xcode上iphone模拟器颜色的方法--备用
  10. codeforces Ilya and Matrix
  11. java之常用正则表达式
  12. leetcode--011 copy list with random pointer
  13. RabbitMQ入门-消息订阅模式
  14. python笔记:#002#第一个python程序
  15. 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes
  16. Hive环境搭建及测试
  17. Python操作Memcached
  18. Spring-boot之 swagger2
  19. Python爬虫【三】利用requests和正则抓取猫眼电影网上排名前100的电影
  20. Python __str__函数

热门文章

  1. uoj50【UR#3】链式反应
  2. 【arc073D】Many Moves
  3. CentOS 7安装zabbix-2.4.8监控
  4. golang简单实现二叉树的数据添加和遍历
  5. python调用powershell、远程执行bat
  6. [大数据]-Fscrawler导入文件(txt,html,pdf,worf...)到Elasticsearch5.3.1并配置同义词过滤
  7. P1621 集合
  8. Shell记录-Shell命令(文件权限)
  9. iview组件 eslint校验出错 Parsing error: x-invalid-end-tag
  10. 在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果