NOIP 2011 day1 選擇客棧_NOIP

來源:互聯網
上載者:User



題目大意:


      

麗江河邊有 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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.