题目大意:
给n个孩子分发糖果,每个孩子知道自己左边比自己糖果数多的人的个数,也知道自己右边比自己糖果数多的人的个数,要求你找出一种满足的分配方案.
题解:
对于每个人,他的l[i]+r[i]约小,说明他的糖果数越多;反之,他的l[i]+r[i]越大,说明他的糖果数越少。
所以我们就让v[i]=n-l[i]-r[i],然后检查第i个人的左右两边是不是满足l[i]和r[i]的条件,只要有一个人不满足,就是NO
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ll long long
#define INF 1000000007
struct node
{
int l,r,v;
}a[1010];
int main()
{
//freopen("input.txt","r",stdin);
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i].l;
for(int i=1;i<=n;++i)
cin>>a[i].r;
for(int i=1;i<=n;++i)
a[i].v=n-a[i].l-a[i].r;
for(int i=1;i<=n;++i)
{
for(int j=1;j<i;++j)
if(a[j].v>a[i].v)
--a[i].l;
for(int j=i+1;j<=n;++j)
if(a[j].v>a[i].v)
--a[i].r;
if(a[i].l!=0 || a[i].r!=0)
return puts("NO");
}
puts("YES");
for(int i=1;i<=n;++i)
cout<<a[i].v<<(i==n?'\n':' ');
return 0;
}