嗯這道題我的做法是典型的用空間換時間
用a[i][j]記錄顏色為i的客棧出現的座標,每次列舉當前客棧到前乙個同顏色的客棧間是否有符合條件的客棧,如果有,就是當前客棧之前出現的所有同色客棧數量,如果沒有,就是上乙個同色客棧的答案數,最後從頭到尾遍歷一遍每個客棧的答案累加,輸出,結束
但是就在我寫這篇部落格的時候,我突然意識到,對於a陣列,當當前節點為j時,我最多只用到了同色的客棧數以及a[i][j-1],那不就可以優化一維只記錄上次同色客棧的答案數麼???????那不就不用用空間換時間了?????
md我真是個智障。。
附上我無腦開的不知道浪費了多少空間的**。。。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9#define ll long long
10using
namespace
std;
11const ll oo=0x3f3f3f3f;12
const ll n=200005;13
const ll m=55;14
15ll n,k,p,sum;
16ll ans[n],a[m][n],b[n];
1718 ll min(ll a,ll b)
19 ll max(ll a,ll b)
20 ll abs(ll a)
2122 ll get
()29
while(zy>='
0'&&zy<='9'
)33return z*y;34}
3536
intmain()49}
50if(ok) ans[i]=a[c][0
];51
else ans[i]=ans[a[c][a[c][0
]]];52}
53 a[c][++a[c][0]]=i;54}
55for(ll i=1;i<=n;i++) sum+=ans[i];
56 printf("
%lld\n
",sum);
57return0;
58 }
P1311選擇客棧
這是2011年提高組d1t2,是乙個綠色的模擬題,不出所料,沒寫出 來。首先輸入n個客棧的顏色和最低消費,然後根據 同顏色但不是乙個客棧 以及 兩個客棧之間必須有乙個的最低消費 p 確定出最大的住宿方案數。然後我首先想到了暴力法 for 第乙個客棧 顯然2e5肯定超時 當然賽場上可以這麼暴力去寫 還...
P1311 選擇客棧
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...
P1311 選擇客棧
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...