选择客栈
Posted 【對策局】
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择客栈相关的知识,希望对你有一定的参考价值。
【题目描述】
丽江边有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()中如此处理并不会漏下什么。 */
以上是关于选择客栈的主要内容,如果未能解决你的问题,请参考以下文章