首页 > 试题广场 >

[NOIP2011]选择客栈

[编程题][NOIP2011]选择客栈
  • 热度指数:166 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号。每家客栈都按照某一种色调进行装饰(总共k种,用整数 0~k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。


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


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

输入

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

输出

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。
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int color = scanner.nextInt();
        int maxPrice = scanner.nextInt();
        int[][] nums = new int[n][2];
        for(int i=0; i<n; i++){
            nums[i][0] = scanner.nextInt();
            nums[i][1] = scanner.nextInt();
        }
        int[] coffee = new int[n+1];

        List<List<Integer>> list = new ArrayList<>();

        for(int i=0; i<color; i++){
            list.add(new ArrayList<>());
        }
        for(int i=0; i<n; i++){
            coffee[i+1] = nums[i][1]<=maxPrice? coffee[i]+1:coffee[i];
            list.get(nums[i][0]).add(i);
        }
        int sum = 0;
        for(List<Integer> sub : list){
             int size = sub.size();
             int[] dp = new int[size];
             for(int i = 1; i<size; i++){
                 dp[i] = (coffee[sub.get(i)+1]-coffee[sub.get(i-1)])>0? i:dp[i-1];
                 sum+=dp[i];
             }
        }
        System.out.println(sum);

    }
}

发表于 2022-07-28 22:54:40 回复(0)

问题信息

难度:
1条回答 1799浏览

热门推荐

通过挑战的用户