問題描述
在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。
第一天,每個商店都自己定了乙個正整數的**。店主們希望自己的菜價和其他商店的一致,第二天,每一家商店都會根據他自己和相鄰商店的**調整自己的**。具體的,每家商店都會將第二天的菜價設定為自己和相鄰商店第一天菜價的平均值(用去尾法取整)。
注意,編號為1的商店只有乙個相鄰的商店2,編號為n的商店只有乙個相鄰的商店n-1,其他編號為i的商店有兩個相鄰的商店i-1和i+1。
給定第二天各個商店的菜價,可能存在不同的符合要求的第一天的菜價,請找到符合要求的第一天菜價中字典序最小的一種。
字典序大小的定義:對於兩個不同的**序列(a1, a2, ..., an)和(b1, b2, b3, ..., bn),若存在i (i>=1), 使得ai輸入格式
輸入的第一行包含乙個整數n,表示商店的數量。
第二行包含n個正整數,依次表示每個商店第二天的菜價。
輸出格式
輸出一行,包含n個正整數,依次表示每個商店第一天的菜價。
樣例輸入
82 2 1 3 4 9 10 13
樣例輸出
2 2 2 1 6 5 16 10
資料規模和約定
對於30%的評測用例,2<=n<=5,第二天每個商店的菜價為不超過10的正整數;
對於60%的評測用例,2<=n<=20,第二天每個商店的菜價為不超過100的正整數;
對於所有評測用例,2<=n<=300,第二天每個商店的菜價為不超過100的正整數。
請注意,以上都是給的第二天菜價的範圍,第一天菜價可能會超過此範圍。
簡單的純dfs30分,用前兩天的菜價限定第三天的菜價範圍70分,加上記憶化剪枝90分。還有十分,大佬們說是差分約束,我再琢磨琢磨。先儲存下90分的**。
#include #include#include#include#include#include#include#includeusing namespace std;
#define read(x) scanf("%d",&x)
const int maxn = 3e2+10;
int n,m,t;
int a[maxn],b[maxn];
int dp[maxn][120][120];
int check()
int dfs(int k)
return 0;
}j=b[k-1]*3-a[k-1]-a[k-2];if(j<0) j=1;
for(i=j;i<=b[k-1]*3+2-a[k-1]-a[k-2];i++)
return 0;
}int main()
memset(dp,0,sizeof(dp));
for(i=1;i<=b[1]*2;i++)
for(j=1;j<=b[2]*3;j++)
}return 0;}/*
82 2 1 3 4 9 10 13
*/
ccf 201809 4 再賣菜 70分暴力
思路是深搜,然後根據他給的 約束可以取的值減小一點複雜度,最後選夠了之後計算並與答案相比較,由於是從一開始搜的,那麼答案一定是字典序最小的,考試的時候打了個這個才30分,現在變成了70分,鬱悶啊.加上這四十分我就差十分就會程式設計了.話說這次第三題沒寫,第四題可能是敲錯了?第五題暴力20分.簡直就是...
CCF 201809 4 試題名稱 再賣菜
參考部落格 201809 4 再賣菜 ccf 剪枝優化 題目就不貼了。題目要求 給出商店的第二天的菜價,第二天的菜價是第一天臨近商店的 的平均值 求平均時使用去尾法求整 要求找到符合要求的第一天菜價中字典序最小的一種。下面分別使用a,b a,ba,b表示第一天,第二天的菜價,由題意可得,菜價應滿足下...
CCF CSP201809 4再賣菜(記憶化搜尋)
本文參考 迷你之忍 的文章 ccf再賣菜 試題編號 201809 4 試題名稱 再賣菜 時間限制 1.0s 記憶體限制 256.0mb 問題描述 在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。第一天,每個商店都自己定了乙個正整數的 店主們希望自己的菜價和其他商店的一致,第...