zoukankan      html  css  js  c++  java
  • 选择客栈

    【题目描述】

    丽江边有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()中如此处理并不会漏下什么。
    */
  • 相关阅读:
    GridView的简单使用
    获取当前应用程序的版本号
    Android EditText输入光标居于开头最开始位置
    Linux-开机启动程序-chkconfig
    Linux-显示行号-方案
    Linux-命令-cat
    Linux-测试-第二关
    Linux-正则-Reg
    Linux-测试-第一关
    Linux-命令-uname
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5936074.html
Copyright © 2011-2022 走看看