貪心演算法----整數區間__演算法
來源:互聯網
上載者:User
一、題目描述 給n個區間,形式為[a, b],a和b均為整數,且a < b。
求一個最小的整數點的集合,使得每個區間至少2個不同的元素(整數點)屬於這個集合。
求這個集合的元素個數。
輸入
第1行:1個整數n(1 <= n <= 10000)
接下來n行,每行2個整數,表示區間的左右端點a, b(0 <=a < b <= 10000)
輸出
第1行:1個整數,表示集合的元素的個數
範例輸入
4
3 6
2 4
0 2
4 7
範例輸出
4
二、定義解釋
區間:就像線段一樣,給出線段的端點座標a、b(a<b),a和b之間的部分就叫區間。 開區間:(a,b)------區間中不包含a,b的值。 閉區間:[a,b]------區間中包含a,b的值。 整數閉區間中的元素:如:閉區間[3,6]中的元素有3、4、5、6. 集合:滿足某條件的所有的數。 三、分析
這道題比較難懂,我看了很久才發現題目的意思,就是給你n個閉區間,找一些數使每一個閉區間都有這些數中的兩個數。我們可以先把原資料存入結構體中,再重載運算子,方便排序。 #include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int x,y,s;
bool operator < (const node &p)const {
if(y<p.y) return 1;
else if(y==p.y&&x<=p.x) return 1;
return 0;
}
}a[10005],t;
int main()
{
int n,i,j,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].s=2;//標記該閉區間剩下需要的元素
}
sort(a+1,a+n+1);//排序
}
我們可以運用貪心的方法來做這一道題。 for(i=1;i<=n;i++){
if(a[i].s>0){//a[i]可用
a[i].s--;//a[i]所需的元素-1
for(j=i+1;j<=n;j++){//該元素在其他閉區間是否存在
if(a[i].y>=a[j].x&&a[i].y<=a[j].y)
a[j].s--;
}
sum++;
if(a[i].s>0)//再進行一次判斷
{
a[i].s--;
for(j=i;j<=n;j++){
if(a[i].y-1>=a[j].x&&a[i].y-1<=a[j].y)
a[j].s--;
}
sum++;
}
}
} printf("%d",sum);