180904 再賣菜 ccf

思路ios

dfs+去重數組

關鍵函數

滿分的關鍵在於不一樣的前綴可能會遇到相同的狀況,要直接排除這些狀況,避免重複計算(單純dfs只有80分)spa

實現code

這裏採用數組f來記錄各類狀況,經過traceback函數回溯blog

 1 #include<iostream>
 2 #include<cstring>
 3 
 4 using namespace std;
 5 
 6 int a[305]; 7 int b[305]; 8 bool f[305][305][305];//去重
9 //int s=0; 10 int n; 11 void traceback(int i,int b1,int b2){ 12 /*if(s==1){ 13 return; 14 }*/ 15 if(f[i][b1][b2])return; 16 f[i][b1][b2]=true; 17 if(i>=n){ 18 if((b1+b2)/2==a[n-1]){ 19 for(int j=0;j<n;j++){ 20 cout<<b[j]<<' '; 21 } 22 exit(0); 23 } 24 25 } 26 else{ 27 for(int j=0;j<3;j++){//考慮除法取整的狀況 28 b[i]=a[i-1]*3+j-b2-b1; 29 if(b[i]<=0){ 30 continue; 31 } 32 traceback(i+1,b[i],b[i-1]); 33 /*if(s==1){ 34 return; 35 }*/ 36 } 37 } 38 return; 39 } 40 41 int main(){ 42 memset(f,false,sizeof(f)); 43 cin>>n; 44 for(int i=0;i<n;i++){ 45 cin>>a[i]; 46 } 47 48 int lim=2*a[0]; 49 for(int i=1;i<=lim;i++){ 50 b[0]=i; 51 for(int j=0;j<2;j++){//考慮除法取整的狀況 52 b[1]=lim+j-b[0]; 53 if(b[1]<=0){ 54 continue; 55 } 56 traceback(2,b[1],b[0]); 57 /*if(s==1){ 58 return 0; 59 }*/ 60 } 61 } 62 63 return 0; 64 }

題目ci

問題描述
  在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。
  第一天,每一個商店都本身定了一個正整數的價格。店主們但願本身的菜價和其餘商店的一致,次日,每一家商店都會根據他本身和相鄰商店的價格調整本身的價格。具體的,每家商店都會將次日的菜價設置爲本身和相鄰商店第一天菜價的平均值(用去尾法取整)。
  注意,編號爲1的商店只有一個相鄰的商店2,編號爲n的商店只有一個相鄰的商店n-1,其餘編號爲i的商店有兩個相鄰的商店i-1和i+1。
  給定次日各個商店的菜價,可能存在不一樣的符合要求的第一天的菜價,請找到符合要求的第一天菜價中字典序最小的一種。
  字典序大小的定義:對於兩個不一樣的價格序列(a 1, a 2, ..., a n)和(b 1, b 2, b 3, ..., b n),若存在i (i>=1), 使得a i<b i,且對於全部j<i,a j=b j,則認爲第一個序列的字典序小於第二個序列。
 
輸入格式
  輸入的第一行包含一個整數n,表示商店的數量。
  第二行包含n個正整數,依次表示每一個商店次日的菜價。
 
輸出格式
  輸出一行,包含n個正整數,依次表示每一個商店第一天的菜價。
 
樣例輸入
8
2 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的正整數。   請注意,以上都是給的次日菜價的範圍,第一天菜價可能會超過此範圍。
相關文章
相關標籤/搜索