列表

详情


NC50245. weight

描述

已知原数列中的前1项,前2项,前3项,,前n项的和,以及后1项,后2项,后3项,,后n项的和,但是所有的数都被打乱了顺序。此外,我们还知道数列中的数存在于集合S中。试求原数列。当存在多组可能的数列时,求字典序最小的数列。

输入描述

第1行,一个整数n。第2行,个整数,注意:数据已被打乱。第3行,一个整数m,表示S集合的大小。第4行,m个整数,表示S集合中的元素。

输出描述

输出满足条件的最小数列。

示例1

输入:

5
1 2 5 7 7 9 12 13 14 14
4 
1 2 4 5

输出:

1 1 5 2 5

说明:

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 536K, 提交时间: 2023-03-22 18:09:32

#include<bits/stdc++.h>
using namespace std;
int num[10010];
int ans[10010];
int maps[10010];
int n,m;
int sum;
void dfs(int l,int r,int sl,int sr,int index)
{
    if(l==r)
    {
        int g=sum-sl-sr;
        if(g>=1&&g<=500&&maps[g]==1)
        {
            ans[l]=g;
            for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
            exit(0);
        }
        return ;
    }
    int h=num[index]-sl;
    if(h<=500&&maps[h])
    {
        ans[l]=h;
        dfs(l+1,r,num[index],sr,index+1);
    }
    int j=num[index]-sr;
    if(j<=500&&maps[j])
    {
        ans[r]=j;
        dfs(l,r-1,sl,num[index],index+1);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=2*n;i++)cin>>num[i];
    cin>>m;
    for(int i=1,u;i<=m;i++)
    {
        cin>>u;
        maps[u]=1;
    }
    sort(num+1,num+1+2*n);
    sum=num[2*n];
    dfs(1,n,0,0,1);
}

C++(clang++11) 解法, 执行用时: 5ms, 内存消耗: 472K, 提交时间: 2021-03-05 19:39:57

#include<bits/stdc++.h>
using namespace std;
int n,m,sum,a[2005],ans[1005];
bool S[505];
void dfs(int L,int R,int sl,int sr,int k)
{
	if(L==R)
	{
		if(sum-sl-sr<=500&&S[sum-sl-sr])
		{
			ans[L]=sum-sl-sr;
			for(int i=1;i<=n;i++)
			printf("%d ",ans[i]);
			exit(0);
		}
		return;
	}
	if(a[k]-sl<=500&&S[a[k]-sl])
	{
		ans[L]=a[k]-sl;
		dfs(L+1,R,a[k],sr,k+1);
	}
	if(a[k]-sr<=500&&S[a[k]-sr])
	{
		ans[R]=a[k]-sr;
		dfs(L,R-1,sl,a[k],k+1);
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=2*n;i++)
	cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x;
		cin>>x;
		S[x]=1;
	}
	sort(a+1,a+2*n+1);
	sum=a[2*n];
	dfs(1,n,0,0,1);
	return 0;
}

上一题