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

    P1311 选择客栈

      • 375通过
      • 1K提交
    • 题目提供者该用户不存在
    • 标签递推2011NOIp提高组
    • 难度普及+/提高

    提交该题 讨论 题解 记录

     

    题目描述

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

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

    他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p元的咖啡店小聚。

    输入输出格式

    输入格式:

    输入文件hotel.in,共n+1 行。

    第一行三个整数n ,k ,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;

    接下来的n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和i 号客栈的咖啡店的最低消费。

    输出格式:

    输出文件名为hotel.out 。

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

    输入输出样例

    输入样例#1:
    5 2 3 
    0 5 
    1 3 
    0 2 
    1 4 
    1 5 
    
    输出样例#1:
    3
    

    说明

    【输入输出样例说明】

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

    【数据范围】

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

    对于50% 的数据,有 n ≤1,000;

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

    分析:一开始想到的就是n^3爆搜了,不过这数据不久等于送死吗......不知道是哪位神犇发明的一种神奇的解法:首先我们看,当找到一个旅店,在右边,若是其左边有一个符合要求的咖啡店,那么再往左边看,如果有一个颜色相同的旅店,那么就算是一种住宿方法了,那么如果以这个右边的旅店作为对应点,将所有在左边而且颜色与之相同的旅店数相加,就能得出很多种住宿方法了。那么用这个办法,用所有的对应点对应过去,就能最快的时间内找出所用的酒店了。a数组是记录同一种颜色中的酒店所出现的最后一次的位置;b数组记录同一种颜色的酒店的出现次数,而c数组则是临时记录当前同样颜色的酒店出现的次数,也就是为找对应点而进行的临时记录。 实质上就是加法原理+乘法原理.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n,k,p,m,ans;
    int a[200010],b[200010],c[200010];
    
    int main()
    {
        scanf("%d%d%d",&n,&k,&p);
        for (int i = 1; i <= n; i++)
        {
            int k, q;
            scanf("%d%d",&k,&q);
            if (q <= p) //找最近的消费≤p的咖啡店
            m = i;
            if (m >= a[k])
            c[k] = b[k]; //更新位置,当前的客栈可以和上一次色调为k的客栈组合成一种方案
            a[k] = i; 
            ans += c[k];
            b[k]++;
        }
        printf("%d",ans);
        
        return 0;
     } 
  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5719729.html
Copyright © 2011-2022 走看看