codeforces1054 C. Candies Distribution
构造类型的算法,与快速排序的思想有类似的地方。
即左边比它的个数加右边比它大的个数,正好是这个数的位置
知道每个数的位置,然后填数,再验证是否正确
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<string> #include<vector> #define DEBUG(x) cout<<#x<<" = "<<x<<endl const int MAXN=1e3+10; using namespace std; int n; int l[MAXN]; int r[MAXN]; int pos[MAXN]; int cache[MAXN]; int main() { ///freopen("in.txt","r",stdin); scanf("%d",&n); for(int i=0;i<=n ;i++ ){ cache[i]=n-i; } for(int i=0;i<n ;i++ ){ scanf("%d",&l[i]); } int m=-1; for(int i=0;i<n ;i++ ){ scanf("%d",&r[i]); ///左边比它的个数加右边比它大的个数,正好是这个数的位置 pos[i]=l[i]+r[i]; } vector<int>rslt; for(int i=0;i<n ;i++ ){ rslt.push_back(cache[pos[i]]); } bool ok=true; for(int i=0;i<n ;i++ ){ int cnt=0; for(int j=0;j<i ;j++ ){ if(rslt[j]>rslt[i])cnt++; } if(cnt!=l[i]){ ok=false;break; } } if(ok){ for(int i=n-1;i>=0 ;i-- ){ int cnt=0; for(int j=i+1;j<n ;j++ ){ if(rslt[j]>rslt[i])cnt++; } if(cnt!=r[i]){ ok=false;break; } } } if(ok){ printf("YES\n"); for(int i=0;i<n ;i++ ){ printf("%d ",rslt[i]); } } else printf("NO\n"); }