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

    题目描述

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

    两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p。
    他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p元的咖啡店小聚。

    输入

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

    输出

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

    样例输入

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

    样例输出

    3



    输入输出样例说明:

    客栈编号        1    2    3    4    5

    色调                0    1    0    1    1

    最低消费        5    3    2    4    5

     

    2 人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤,

    但是若选择住 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

    Solution:
      神奇的O(n)做法。
      OMG_link大佬的奇思妙想(%%%)。
      //回家更新~
     
           更新:
        最初开始做这道题以为需要O(N^2)甚至是O(N^3)的算法的,但实际上有一种解法O(N)就可以巧妙地A惹。
        首先对题意进行分析后发现,低于p的是可以直接剪掉的。
        之后,运用一点数学的小技巧(雾),即组合数。
        可以得出:ans=所有色调相同的客栈两两匹配的个数-因p而剪去的个数。

        for一遍就可解决惹(OMG_link太巨了%%%)

        
     1 #include<cstdio> 
     2 #define MAXN 55 
     3 using namespace std; 
     4 int a[MAXN],b[MAXN],c[MAXN]; 
     5 int ans,find; 
     6 int main(){ 
     7     int n,k,p,x,y; 
     8     scanf("%d%d%d",&n,&k,&p); 
     9     for(int i=1;i<=n;i++){ 
    10         scanf("%d%d",&x,&y); 
    11         if(y<=p) find=i; 
    12         if(find>=c[x]) b[x]=a[x]; 
    13         ans+=b[x]; 
    14         a[x]++; 
    15         c[x]=i; 
    16     } 
    17     printf("%d",ans); 
    18     return 0; 
    19 } 
  • 相关阅读:
    MySQL 5.7 Invalid default value for 'CREATE_TIME'报错的解决方法
    浅析mysql中exists 与 in 的使用
    mysql 索引原理
    内存溢出与内存泄漏
    java 内部类详解
    JAVA中重写equals()方法的同时要重写hashcode()方法
    Java中volatile关键字解析
    JDK1.8 HashMap源码分析
    mysql 行转列 列转行
    Java多线程(十)——线程优先级和守护线程
  • 原文地址:https://www.cnblogs.com/drizzly/p/7544314.html
Copyright © 2011-2022 走看看