NOIp提高组 2011选择客栈————贪心+递推

题解:本题主要考查贪心+递推。
简要题意:两个客栈a,b,满足a,b颜色相同且[a,b]闭区间之间必须存在某个客栈的咖啡店的花费<=p。求满足的方案数。
1.贪心+递推:我们枚举客栈,用t来记录最近的花费小于等于p的客栈,以它为选择的咖啡店,向后枚举记录到上一个t的客栈颜色种类数(因为[a,b]闭区间有花费小于等于p的)。
所以如果这个客栈更新了t,ans+=num[这个客栈的颜色]-1
如果这个客栈没有更新t,ans+=num[这个客栈的颜色]
代码如下:

#include<iostream>
using namespace std;
int color[233333],num[233333],money[233333];
int n,k,p,t,ans;
int main()
{
	cin>>n>>k>>p;
	for(int i=1;i<=n;i++)cin>>color[i]>>money[i];
	for(int i=1;i<=n;i++)
	{
		if(p>=money[i])
		{
		    for(int j=i;j>t;j--)num[color[j]]++;
		    t=i;
		    ans+=num[color[i]]-1;
		}
		else ans+=num[color[i]];
	}
	cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值