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