码迷,mamicode.com
首页 > 其他好文 > 详细

weight

时间:2019-06-12 09:24:02      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:har   dfs   include   ack   its   href   inline   png   ora   

题目链接:

技术图片

就是大概这么个东西

根据题意,我们可以清楚的知道:这个题我不会,这个题需要先将2n个数进行排序

这样每对于一个小的前(后)缀和总会在队列最前或队列最后

设这个数为k

那么判断总的Sum(n)-k是否在集合之中就可以啦

当然,如果不在集合之中,我们就要重新的回溯一遍

直到成功

PS:若k既满足于前缀和又满足于后缀和,先放在前面

因为技术图片

下放代码:

//weight
#include <bits/stdc++.h>

using namespace std;

const int N = 0x3f3f3f3f;
int n, s[N], m, a[N], t[N], flag, ans[N], all;

inline int read()
{
    int x = 0, y = 1;
    char z = getchar();
    while (z < 0 || z > 9)
    {
        if (z == -)
        {
            y = -1;
            z = getchar();
        }
    }
    while (z >= 0 && x <= 9)
    {
        x = (x << 3) + (x << 1) + z - 0;
        z = getchar();
    }
}

inline void dfs(int l, int r, int now, int sum1, int sum2)
{
    if (flag)
        return;
    if (l == r)
    {
        int w3 = all - sum1 - sum2;
        if (t[w3])
        {
            ans[l] = w3;
            flag = 1;
        }
        return;
    }
    int w1 = s[now] - sum1;
    if (w1 <= 500 && w1 >= 1 && t[w1]) //属于前缀
    {
        ans[l] = w1;
        dfs(l + 1, r, now + 1, s[now], sum2);
    }
    if (flag)
        return;
    int w2 = s[now] - sum2;
    if (w2 <= 500 && w2 >= 1 && t[w2]) //属于后缀
    {
        ans[r] = w2;
        dfs(l, r - 1, now + 1, sum1, s[now]);
    }
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= 2 * n; i++) //前后缀和
        scanf("%d", &s[i]);
    scanf("%d", &m);
    for (int i = 1; i <= m; i++)
    {
        scanf("%d", &a[i]);
        t[a[i]] = 1;
    }
    sort(s + 1, s + 2 * n + 1);
    all = s[2 * n];
    dfs(1, n, 1, 0, 0);
    for (int i = 1; i <= n; i++)
        printf("%d ", ans[i]);
    return 0;
}

 

weight

标签:har   dfs   include   ack   its   href   inline   png   ora   

原文地址:https://www.cnblogs.com/gongcheng456/p/11007401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!