• NOIP2011 选择客栈


    题目

    vijos1737

    题解

    用ans[i]记录1~i中能与i组合的客栈总数

    那么对于色调相同且距离最近的i,j (i < j),若ij中有可去的咖啡店,那么ans[j]即为j以前色调与j相同的客栈总数;若ij中无可去的咖啡店,那么ans[]=ans[i]

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath> 
    #define N 200005
    using namespace std;
    
    int n,k,p,out;
    int color,cost;
    int last[55];//last[i]记录颜色i上一次出现的位置 
    int sum[N];//将可以去的咖啡店记为1,不能去的记为0,sum[i]记录前缀和 
    int ans[N];//ans[i]记录1~i中能与i组合的客栈总数 
    int num[55];//num[i]记录颜色为i的客栈在之前出现过几次 
    
    int main()
    {
    	scanf("%d%d%d",&n,&k,&p);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&color,&cost);
    		if(cost<=p) sum[i]=sum[i-1]+1;
    		else sum[i]=sum[i-1]; 
    		if(!last[color]) last[color]=i;
    		else
    		{
    			if(sum[i]-sum[last[color]-1]) ans[i]=num[color];
    			else ans[i]=ans[last[color]];
    			last[color]=i;
    		}
    		num[color]++;
    	}
    	for(int i=1;i<=n;i++) out+=ans[i];
    	printf("%d",out);
    	return 0;
    }
  • 相关阅读:
    16. 3Sum Closest
    17. Letter Combinations of a Phone Number
    20. Valid Parentheses
    77. Combinations
    80. Remove Duplicates from Sorted Array II
    82. Remove Duplicates from Sorted List II
    88. Merge Sorted Array
    257. Binary Tree Paths
    225. Implement Stack using Queues
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/XYZinc/p/7551312.html
Copyright © 2020-2023  润新知