#NOIP2011#选择客栈

【NOIP2011】选择客栈

时间限制: 1 Sec  内存限制: 128 MB

题目描述

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号。每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

输入

输入文件 hotel.in,共n+1 行。
第一行三个整数 n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色
调的数目和能接受的最低消费的最高值;
接下来的 n 行,第i+1 行两个整数,之间用一个空格隔开,分别表示i 号客栈的装饰色
调和i 号客栈的咖啡店的最低消费。

输出

输出文件名为 hotel.out。输出只有一行,一个整数,表示可选的住宿方案的总数。

样例输入

5 2 3
0 5
1 3
0 2
1 4
1 5

样例输出

3

记录满足要求的咖啡店的位置,同时枚举右边的客栈。

g[i][j]表示前i个客栈,颜色为j的一共有多少个。

对于当前右边的客栈i,它能够贡献的方案数为,在它左边,且最靠近它的咖啡店位置以左,与它颜色相同的客栈的个数。

如果当前客栈i满足作为咖啡店的价格要求,那么它将贡献g[i][Col[i]] - 1的方案数,即假设咖啡店在i处,与左边的i - 1个客栈中颜色相同的个数。


Code:

#include<iostream> 
#include<cstdio> 
#include<cstdlib> 
#include<cstring> 
#include<algorithm> 
using namespace std; 
  
const int Max = 200000; 
const int Maxk = 50; 
  
int N, K, P; 
int g[Max + 5][Maxk + 5]; 
int Cnt[Maxk + 5], Cost[Max + 5], Col[Max + 5]; 
  
bool getint(int & num){ 
    char c; int flg = 1;    num = 0; 
    while((c = getchar()) < '0' || c > '9'){ 
        if(c == '-')   flg = -1; 
        if(c == -1) return 0; 
    } 
    while(c >= '0' && c <= '9'){ 
        num = num * 10 + c - 48; 
        if((c = getchar()) == -1)   return 0; 
    } 
    num *= flg; 
    return 1; 
} 
  
int main(){ 
    getint(N), getint(K), getint(P); 
    for(int i = 1; i <= N; ++ i) 
        getint(Col[i]), getint(Cost[i]), 
        ++ Cnt[Col[i]]; 
    for(int i = 1; i <= N; ++ i){ 
        for(int k = 0; k < K; ++ k) 
            g[i][k] = g[i - 1][k]; 
        ++ g[i][Col[i]]; 
    } 
    int Ans = 0, p = 1; 
    for(int i = 2; i <= N; ++ i){ 
        if(Cost[i] <= P)    p = i; 
        Ans += g[p][Col[i]] - (p == i ? 1 : 0); 
    } 
    printf("%d\n", Ans); 
    return 0; 
} 





发布了161 篇原创文章 · 获赞 5 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章