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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章