題目大意:
麗江河邊有 n 家很有特色的客棧,客棧按照其位置順序從1 到n 編號。每家客棧都按照
某一種色調進行裝飾(總共k 種,用整數0 ~ k-1 表示),且每家客棧都設有一家咖啡店,每
家咖啡店均有各自的最低消費。
兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定
分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於
兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過p。
他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過p
元的咖啡店小聚。
解法:
如果一家編號為 i 咖啡店的最低消費大於p,則記flag[ i ]=1;否則,flag[ i ]=0.
考慮到計算滿足要求的對數不太容易, 從反面思考:
從1到n掃描出flag值等於1的連續客棧(在此區間內找到的客棧均為不滿足要求的方案),在掃描時用cnt[j]記錄使用中色彩為j的客棧出現次數
cnt[j]++;
count+=(cnt [j]-1); (新的客棧可以與當前任意顏色相同客棧組合)
可以數出顏色相同但不滿足要求的客棧對數。
答案ans=sum-count.(sum為所有顏色相同的客棧對數)
即為滿足要求的客棧對數
代碼:
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;bool flag[200010];int cnt[100],Count,sum; int main(){int n,k,p,col[200010],tmp;scanf("%d%d%d",&n,&k,&p);for(int i=1;i<=n;i++){scanf("%d",&col[i]);scanf("%d",&tmp);if(tmp>p) flag[i]=1;}for(int i=1;i<=n;i++){if(flag[i]==0){memset(cnt,0,sizeof(cnt));continue;}cnt[col[i]]++;Count+=(cnt[col[i]]-1);}memset(cnt,0,sizeof(cnt));for(int i=1;i<=n;i++){cnt[col[i]]++;sum+=(cnt[col[i]]-1);}cout<<sum-Count<<endl;return 0;}