P1311選擇客棧

2022-03-10 18:17:07 字數 1131 閱讀 5913

這是2023年提高組d1t2,是乙個綠色的模擬題,不出所料,沒寫出**來。

首先輸入n個客棧的顏色和最低消費,然後根據「同顏色但不是乙個客棧」以及「兩個客棧之間必須有乙個的最低消費<=p"確定出最大的住宿方案數。然後我首先想到了暴力法:for(第乙個客棧)}},顯然2e5肯定超時(當然賽場上可以這麼暴力去寫),還想到了用區間dp......看到了一位大佬的思路。直接列舉第二個客棧,只要前面同顏色的客棧是符合要求的,那麼此時ans就應該加上這個顏色客棧的總數。所以我們就要開乙個cnt來儲存每個顏色的客棧有幾個,sum來存當前的方案數,last存這種顏色的最後乙個客棧的位置。所以當列舉i時,只要其符合條件就把i轉移到now上來,假如now>=last,那麼sum就是cnt(其實差這兩個值相差的是<=p的數量)。ans+=sum[color],cnt[color]++。因為當他不滿足,只要他中間滿足也是可以的,方案數再加上這種顏色的客棧數量。

1.當你去優化時間複雜度時,試著去掉資料,直接迴圈輸入進行計算

2.不會寫正解就寫暴力,絕對不可以光想著看題解,要鍛鍊啊

3.不去看演算法標籤了wuwuwu

4.邏輯邏輯能力一定要提公升啊

**

#include#include

#include

#include

#include

#define n 100001

using

namespace

std;

intn,k,p;

int ans=0

;int

last[n],cnt[n],sum[n];

intcolor,cafe;

int now;//

記錄離客棧最近的

intmain()

if(now>=last[color])

last[color]=i;//

讓他當這個顏色的最後一位

ans+=sum[color];

cnt[color]++;//

桶排序,記錄這個顏色客棧數量

} cout

}

P1311 選擇客棧

麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...

P1311 選擇客棧

麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾 總共 k 種,用整數 0 k 1 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...

P1311 選擇客棧

嗯這道題我的做法是典型的用空間換時間 用a i j 記錄顏色為i的客棧出現的座標,每次列舉當前客棧到前乙個同顏色的客棧間是否有符合條件的客棧,如果有,就是當前客棧之前出現的所有同色客棧數量,如果沒有,就是上乙個同色客棧的答案數,最後從頭到尾遍歷一遍每個客棧的答案累加,輸出,結束 但是就在我寫這篇部落...