貪心演算法----整數區間__演算法

來源:互聯網
上載者: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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.