P1286の题解
P1286の题解
本人第一篇题解!!就崩溃了。。。终于找到能发的了
有一点说一下,题目中分号没用 \dfrac{n(n-1)}{2},用的 \frac{n(n-1)}{2},一行里扁扁的看不下去!!!
题目描述
给定
打 Latex 手废了。
贴张图(来自@YudeS)
数学分析
理性分析:尝试打表找规律
设输入为
输入
则
只求
输入
则...
停!这里是四个数的和,而题目给的是两个数,并不能直接求出来,是吧?
怎么可能是呢,干嘛要先求四个数,直接求三个数不就行了吗?
再接着,求出第一个数,
注意,
好的,打 Latex 手又废了。
分析完毕,分析结果:我找不到规律,暴力即可。(要不然要
程序实现
主题框架
- 枚举
ans_1 。 - 计算出
ans_2,\ ans_3 。 - 用搜索枚举
ans_k = a_i - ans_1 。
细节
- 输入时判断所有数的和是否为
n - 1 的倍数(可以从我辛辛苦苦打的公式那证明,证明略),如果不是,那就dream it possible(在梦中成立)。 - 判断合法的方式,选择
ans_i 的时候判断是否有ans_i + ans_j = a_k ,没有就不合法。
code
AC code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, flag;
int ans[20], a[200];
map<int, int> vis; // 谁告诉 you 每个数不重复
bool check(int num, int k) // 检查是否合法,二分的感觉
{
for (int i = 1; i < k; i++)
{
if (!vis[num + ans[i]])
{
return false;
}
}
return true;
}
void dfs(int k, int s) // 已枚举到完 ans_{k-1},上一个合法的是到 a_s
{
if (k > n) // 枚举完输出
{
for (int i = 1; i <= n; i++)
{
printf("%d ", ans[i]);
}
printf("\n");
flag = 1;
return;
}
for (int i = s; i <= n * (n - 1) / 2; i++) // 枚举 ans_k
{
if (check(a[i] - ans[1], k))
{
ans[k] = a[i] - ans[1]; // 求出 ans_k
for (int j = 1; j < k; j++) // 不知道叫什么
{
vis[ans[k] + ans[j]]--;
}
dfs(k + 1, i + 1); // 递归
if (flag) // 找到就退出
{
return;
}
for (int j = 1; j < k; j++) // 回溯
{
vis[ans[k] + ans[j]]++;
}
}
}
}
int main()
{
while (scanf("%d", &n) == 1) // 等价于 ~ 和 != EOF
{
flag = 0; // 重置
int sum = 0;
vis.clear();
for (int i = 1; i <= n * (n - 1) >> 1; i++) // 数入
{
scanf("%d", &a[i]);
sum += a[i];
vis[a[i]]++;
}
if (sum % (n - 1)) // 判断无解
{
printf("Dream it possible\n");
continue;
}
sort(a + 1, a + 1 + n * (n - 1) / 2);
for (int i = 0; a[1] - i > i; i++) // 枚举第一个数
{
ans[1] = i;
ans[2] = a[1] - i;
ans[3] = a[2] - i;
vis[a[1]]--;
vis[a[2]]--;
if (vis[ans[2] + ans[3]])
{
vis[ans[2] + ans[3]]--;
dfs(4, 3); // 已经选出前三个了,选第四个
if (flag) // 已找到
{
break;
}
vis[ans[2] + ans[3]]++;
}
vis[a[1]]++;
vis[a[2]]++;
}
if (!flag) // 没找到,好强的数据
{
printf("Dream it possible\n");
continue;
}
}
return 0;
}
鸣谢
- 让我少打了亿点点
\LaTeX 的 @YudeS。 - 给我没通过的审核,但提出了宝贵的标点符号建议 @swiftc。
- 给我没通过的审核,但给出了宝贵的标题建议 @CSP_Sept。
- 给我没通过的审核,但给出了宝贵的标题建议 @_maze。
- 给我没通过的审核,但给出了宝贵的标点符号建议 @蒟蒻君HJT
- 给我没通过的审核,但给出了宝贵的行号建议 @_maze
鸣谢这么多应该能过了