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;
}
加油,ヾ(◍°∇°◍)ノ゙