再卖菜
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<queue> #include<map> using namespace std; int a[505],b[505],ans[505]; int n,flag=0; void dfs(int x,int y,int pos) { if(pos == n-1) { flag++; if(flag == 1) { for(int i=0;i<n;i++) ans[i]=b[i]; } return; } if(flag>0) return; if(pos == 0) { int l,r; l = a[pos]*2; r = a[pos]*2+2; for(int i=1;i<r;i++) { for(int j=l-i;j<r-i;j++) { if(j<=0) continue; b[pos] = i; b[pos+1] = j; dfs(i,j,pos+1); } } } else if(pos == n-2) { int l,r; l = a[pos]*3-x-y; r = a[pos]*3+3-x-y; //去尾法的最大误差不超过3 if(r<=0) return; if(l<=0) l=1; for(int i=l;i<r;i++) { if(y+i>=a[pos+1]*2 && y+i<a[pos+1]*2+2) { b[pos+1] = i; dfs(y,i,pos+1); } } } else { int l,r; l = a[pos]*3-x-y; r = l+3; if(r<=0) return; if(l<=0) l=1; for(int i=l;i<r;i++) { b[pos+1] = i; dfs(y,i,pos+1); } } } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; dfs(0,0,0); for(int i=0;i<n;i++) cout<<ans[i]<<" "; return 0; }