洛谷P1311 選擇客棧

2022-08-05 03:24:13 字數 1479 閱讀 8601

洛谷p1311 選擇客棧 

時間複雜度o(n*k)

開兩個字尾和陣列 a[ i ].color[ j ] 表示在i之後 (包括 i ) 有多少間 客棧是j 顏色的

以及 a[ i ].last 表示在i之後 (包括i ) 第乙個小於等於 x 的 咖啡店的座標

並且要特判一下 a[ i ].last == i 的情況 這是顏色相同的咖啡店數量要減一

1 #include 2

#define for(i,j,k) for(int i=j;i<=k;i++)

3#define ll long long

4using

namespace

std ; 56

const

int n = 200011; 7

struct

nodea[n];

10int

n,k,pos,alpha,num ;

11ll sum ;

12int

color[n],money[n] ;

1314

struct

stackst[n];

1718 inline int

read() 19

23while(ch>='

0'&&ch<='

9')

24return x *f ; 25}

2627

intmain()

2834

for(int i=n;i>=1;i--)

39 pos = n+1

; 40

for(int i=n;i>=1;i--)

44 for(i,1

,n)

50 printf("

%lld\n

",sum) ;

51return0;

52 }

考慮乙個dp,第i個客棧的顏色為x,設f[i]表示i之前(不包括i)顏色為x能用的客棧的數量。

記一下c[x]表示顏色為x的最近的客棧,cnt[x]表示i之前(不包括i)所有顏色為x的客棧總數,

顯然c[x]之前的所有能用的客棧,仍然能與客棧i搭配,所以f[i]=f[c[x]];如果c[x]和i可以搭配,

那麼i之前所有的客棧全都可以用,所以f[i]=cnt[x],判斷的話就看最近的能用的咖啡館是不是在c[x]之後(含);

答案就是∑f[i]。這時候已經可以得滿分了,但是注意到f只與顏色有關,所以可以優化,**如下:

1 #include2

int n,k,p,i,x,y,lst,f[51],cnt[51],c[51

],ans;

3int

main()

417 printf("

%d\n

",ans);

18return0;

19 }

洛谷 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 表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家...