信息学奥赛一本通(1324:【例6.6】整数区间)
1324:【例6.6】整數(shù)區(qū)間
時間限制: 1000 ms ??? ??? 內(nèi)存限制: 65536 KB
提交數(shù): 7185 ??? 通過數(shù): 4260
【題目描述】
請編程完成以下任務(wù):
1.讀取閉區(qū)間的個數(shù)及它們的描述;
2.找到一個含元素個數(shù)最少的集合,使得對于每一個區(qū)間,都至少有一個整數(shù)屬于該集合,輸出該集合的元素個數(shù)。
【輸入】
首行包括區(qū)間的數(shù)目n,1≤n≤10000,接下來的n行,每行包括兩個整數(shù)a,b,被一空格隔開,0≤a≤b≤10000,它們是某一個區(qū)間的開始值和結(jié)束值。
【輸出】
第一行集合元素的個數(shù),對于每一個區(qū)間都至少有一個整數(shù)屬于該區(qū)間,且集合所包含元素數(shù)目最少。
【輸入樣例】
4 3 6 2 4 0 2 4 7【輸出樣例】
2【分析】
? ? ? ? 算法模型∶給 n個閉區(qū)間 [ai, bi],在數(shù)軸上選盡量少的點,使每個區(qū)間內(nèi)至少有一個點。
? ? ? ? 算法:首先按 b1<=b2<=…<=bn 排序。每次標(biāo)記當(dāng)前區(qū)間的右端點 x,并右移當(dāng)前區(qū)間指針,直到當(dāng)前區(qū)間不包含 x,再重復(fù)上述操作。如下圖,如果選灰色點,移動到黑色點更優(yōu)。
【輸出樣例】
#include <stdio.h> #define N 10010 struct point {int x;int y; }a[N],t;int main() {int i,j,x,sum=0,n;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d%d",&a[i].x,&a[i].y);for(i=0;i<n-1;i++) //比較排序 {for(j=i+1;j<n;j++){if(a[i].y>a[j].y){t=a[i];a[i]=a[j];a[j]=t;}}}x=-1;for(i=0;i<n;i++){if(x>=a[i].x)continue; //貪心,如果當(dāng)前區(qū)間包含標(biāo)記點,就跳過sum++;x=a[i].y;}printf("%d\n",sum); //更新標(biāo)記點 return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1324
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通(1324:【例6.6】整数区间)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1401:机器翻译)
- 下一篇: 信息学奥赛一本通(1091:求阶乘的和)