1461: 飢餓的牛 貪心 +優先隊列

1461: 飢餓的牛

時間限制: 1 Sec  內存限制: 128 MB
提交: 25  解決: 14
您該題的狀態:已完成
[提交][狀態][討論版]

題目描述

牛在飼料槽前排好了隊。飼料槽依次用1到N(1<=N<=2000)編號。每天晚上,一頭幸運的牛根據約翰的規則,吃其中一些槽裏的飼料。

    約翰提供B個區間的清單。一個區間是一對整數start-end,1<=start<=end<=N,表示一些連續的飼料槽,比如1-3,7-8,3-4等等。牛可以任意選擇區間,但是牛選擇的區間不能有重疊。

當然,牛希望自己能夠吃得越多越好。給出一些區間,幫助這隻牛找一些區間,使它能吃到最多的東西。

在上面的例子中,1-3和3-4是重疊的;聰明的牛選擇{1-3,7-8},這樣可以吃到5個槽裏的東西。

輸入

第一行,整數B(1<=B<=1000)

    第2到B+1行,每行兩個整數,表示一個區間,較小的端點在前面。

輸出

僅一個整數,表示最多能吃到多少個槽裏的食物。

樣例輸入

<span style="color:black">3
1 3
7 8
3 4
</span>

樣例輸出

<span style="color:black">5
</span>

 優先隊列對結構體進行排列,讓末端點從小到大排列,在設置一個標誌位,記錄上一個區間的末端點,如果大於這個標誌,則進行累加。不大於的話,扔掉。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct 
{
	int former,later;
}node;
bool operator <(const node &a,const node &b)
{
	return a.later>b.later;
}
int main()
{
	priority_queue<node> q;
	node s[1001];
	int i,j,n;
	int sum=0,last=-1;
	cin>>n;
    for(i=0;i<n;i++)
    {
    	cin>>s[i].former>>s[i].later;
    	q.push(s[i]);
	}
	while(!q.empty())
	{
		node d=q.top();
		q.pop();
		if(d.former>last)
		{
			sum+=(d.later-d.former+1);
			last=d.later;
		}
	}
	cout<<sum<<endl;
	return 0;
}

 加油,ヾ(◍°∇°◍)ノ゙

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章