选择客栈

【题目描述】

丽江边有n家客栈,客栈按照其位置顺序从1~n编号。每家客栈都按某一种色调进行装饰(总共k种,用0~k-1表示),且每家客栈都有一家咖啡店,每家咖啡店均有各自的最低消费。

两位游客一起去丽江旅游,他们分别住在色调相同的两家客栈中,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。

现询问总共有多少种住宿的方案,保证可以找到一家最低消费不超过p元的咖啡店。

【输入描述】

输入n+1行。

第一行输入三个整数n、k、p,分别表示客栈总数、色调总数和两人能接受的最低消费的最高值;

接下来n行,每行输入两个整数,分别表示i号客栈的装饰色调和其咖啡店的最低消费。

【输出描述】

输出只有一行,一个整数,表示可选的住宿方案的总数。

【样例输入】

5 2 3

0 5

1 3

0 2

1 4

1 5

【样例输出】

3

【数据范围及提示】

样例如下:

客栈编号

色调 

0

1

0

1

1

最低消费 

5

3

2

4

5

两人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③、②④、②⑤、④⑤,但是若选择住4、5号客栈的话,4、5号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是3元,所以不满足要求。因此只有前3种方案可选。

对于30%的数据,n ≤ 100;

对于50%的数据,n ≤ 1000;

对于100%的数据,2 ≤ n ≤ 200000,0 < k ≤ 50,0 ≤ p ≤ 100,0 ≤ 最低消费 ≤ 100。

源代码:

#include<cstdio>
int N,K,P,Place,Ans,i[50],Num[50],Sum[50];
int main()
{
    scanf("%d%d%d",&N,&K,&P);
    for (int a=1;a<=N;a++)
    {
        int C,M;
        scanf("%d%d",&C,&M);
        if (M<=P) //消费符合条件,记录当前位置。
          Place=a;
        if (Place>=i[C]) //为什么要加这个判断呢?注意,Place有时才更新,i[]每次都更新。一开始脑残觉得加不加这个判断都无所谓,然后就10分蛤蛤蛤。
          Sum[C]=Num[C]; //Sum[]表示某颜色对于当前点符合条件的客栈数量,Num[]表示客栈数量。
        i[C]=a; //更新位置。
        Ans+=Sum[C];
        Num[C]++; //更新总数。
    }
    printf("%d",Ans);
    return 0;
}

/*
    烧脑的模拟题。
    利用了乘法原理,仔细想想会发现,在for()中如此处理并不会漏下什么。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/5936074.html