洛谷 P1311 選擇客棧

2021-08-09 08:38:32 字數 1704 閱讀 7922

原題

首先暴力如果寫的優秀,可以拿到60分,這裡介紹兩種暴力:

40:

#include

#include

#include

#include

#include

using

namespace

std;

int color[200010],cost[200010];

int main()

printf("%d\n",ans/k);

return0;}

這是一種莫名其妙的卡常數,大家不要在意,我只是想拿30分而已......(可是還是沒有30分!!!)

60:

#include

#include

#include

#include

#include

using

namespace

std;

int color[200010],cost[200010];

int main()

printf("%d\n",ans);

return

0;}

那麼接下來看正解:

yzk大佬說過:

這就是一道簡單的數論題.注意到顏色只有100種,多種顏色混合起來使問題變得更複雜,我們考慮單獨考慮每一種顏色的情況

題目的含義為取兩個顏色相同的客棧l,r,使得區間[l,r][l,r][l,r]中含有乙個消費<=p的咖啡店。那麼我們只需要留下有用的資料,若該咖啡店消費<=p則為true,>p則為false。若單獨考慮只有一種顏色,就變成了有多少個區間[l,r][l,r][l,r]使得區間中含有至少乙個true。

假設我們不管這個條件,那麼該種顏色下的客棧個數為n時,我們可以選擇的區間個數是為n*(n-1)/2的。

那我們如何統計含有true的區間個數呢?

反著統計,我們將所有的區間個數減去不含true的區間個數。

我們可以用乙個陣列ca儲存符合條件的咖啡店的下標。

列舉相鄰的兩個咖啡店下標分別為a1,a2

則統計(a1,a2)(a1,a2)(a1,a2)這個區間裡面有k個這種顏色的店子,他們的組合區間數為k*(k-1)/2,再將當前顏色的總組合數n*(n-1)/2減去這個數。因為(a1,a2)(a1,a2)(a1,a2)這個區間絕對不含滿足條件的咖啡店。

每種顏色統計過後,加起來就是答案。

區間同顏色店子的個數可以通過字首和得到。

每種顏色分別處理會比較好。

#include

using

namespace

std;

int color[200010],a[200010],sum[200010],reans;

int main()

a[++can]=n+1;

int ans=0;

for(i=0;i0;

memset(sum,0,sizeof(sum));

for(j=1;j<=n;j++)

ans=(ans-1)*ans/2;

int ans2=0;

for(j=1;j<=can;j++)

reans+=ans;

}printf("%d\n",reans);

return

0;}

洛谷P1311 選擇客棧

做法1 樸素模擬。考慮到此題有可模擬性,所以我們可以列舉i,j,分別為第乙個人住i和第二個人住j的情況,然後再列舉k,k即為兩者中間的點,判斷是否有value p的情況就可以了。做法2 有技巧的運用一些與組合數有關的知識。考慮咖啡館的每個地方所代表的方案,發現我們可以從這裡突破。在讀入時把每乙個點如...

洛谷P1311 選擇客棧

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

洛谷P1311 選擇客棧

做法1 樸素模擬。考慮到此題有可模擬性,所以我們可以列舉i,j,分別為第乙個人住i和第二個人住j的情況,然後再列舉k,k即為兩者中間的點,判斷是否有value p的情況就可以了。做法2 有技巧的運用一些與組合數有關的知識。考慮咖啡館的每個地方所代表的方案,發現我們可以從這裡突破。在讀入時把每乙個點如...