CCF認證-201809-4 再買菜(70分)
CCF認證-201809-4
思路:沒有很好的思路,就暴力了拿了70分,還沒有滿分,還會再更新的。
問題描述
試題編號: | 201809-4 |
試題名稱: | 再賣菜 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。 輸入格式 輸入的第一行包含一個整數n,表示商店的數量。 輸出格式 輸出一行,包含n個正整數,依次表示每個商店第一天的菜價。 樣例輸入 8 樣例輸出 2 2 2 1 6 5 16 10 資料規模和約定 對於30%的評測用例,2<=n<=5,第二天每個商店的菜價為不超過10的正整數; |
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxn=310; int flag,n; int a[maxn],b[maxn],ans[maxn]; void p(int t[]) { printf("%d",t[0]); for(int i=1;i<n-1;i++) printf(" %d",t[i]); printf(" %d\n",t[n-1]); } //超時了---記憶化搜尋/差分約束 void dfs(int u,int t[]) { if(flag) return; if(u==n) { if((t[u-1]+t[u-2])/2==a[u-1]) { for(int i=0;i<n;i++) ans[i]=t[i]; flag=1;return; } } int len,s; if(u==1) { s=a[u-1]*2-t[u-1]; len=(a[u-1]+1)*3-t[u-1]; if(len<=0) return; }//當前的最小與最大的要求 else { s=a[u-1]*3-t[u-1]-t[u-2]; len=(a[u-1]+1)*3-t[u-1]-t[u-2]; if(len<=0) return; } if(s<=0) s=1; for(int i=s;i<len;i++) { t[u]=i; if(u!=n-1&&t[u]>=a[u]*3) return; else if(u==n-1&&(t[u]+t[u-1])/2>a[u]) return;//稍微剪枝一下 dfs(u+1,t); } } int main() { flag=0; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=1;i<(a[0]+1)*2;i++) { b[0]=i;dfs(1,b);if(flag) break;} p(ans); return 0; }