方法一:暴力列舉第乙個客棧、第二個客棧以及兩個客棧之間的客棧,尋找合法的條件,答案++。理論上也就30分吧,結果60分。。。貼一下**
#include#include#include#includeusing namespace std;
const int maxn=200010;
int a[maxn],p[maxn];
int n,k,pr;
int ans=0;
int main()
for(int i=1;i<=n;i++)}}
} }cout《方法二:遞推
一種神奇的做法。我們假設tmp陣列為某種顏色在讀入那個客棧之前擁有的同色客棧數目,num陣列代表某種顏色在讀入那個客棧之前擁有的合法的同色客棧數目。迴圈1到n,讀入color與price,如果當前的咖啡廳**<=p,那麼就把每種顏色的同色客棧的合法數目變成同色客棧數目(例如 紅 紅 紅 此時tmp=3 合法的數目可能是2 讀入乙個price更低的紅色客棧 則之前的所有紅色客棧都合法了,num[j]=tmp[j]。當然,更新其他顏色是因為該客棧的咖啡廳**低,對其他顏色的客棧更新也有貢獻,存下來再說)這時更新答案+=num[color],num[color]++,tmp[color]++。如果讀入的**比p大,那麼tmp[color]++,當前的答案更新(理由同上)
不太好理解 手動模擬一下吧。。。
#include#includeusing namespace std;
int num[50];
int tmp[50];
int n,k,p;
long long ans=0;
int main()
else
}cout
}
洛谷 P1311 選擇客棧
原題 首先暴力如果寫的優秀,可以拿到60分,這裡介紹兩種暴力 40 include include include include include using namespace std int color 200010 cost 200010 int main printf d n ans k r...
洛谷P1311 選擇客棧
做法1 樸素模擬。考慮到此題有可模擬性,所以我們可以列舉i,j,分別為第乙個人住i和第二個人住j的情況,然後再列舉k,k即為兩者中間的點,判斷是否有value p的情況就可以了。做法2 有技巧的運用一些與組合數有關的知識。考慮咖啡館的每個地方所代表的方案,發現我們可以從這裡突破。在讀入時把每乙個點如...
洛谷P1311 選擇客棧
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...