1. 程式人生 > >貪心演算法----整數區間

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

一、題目描述

給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);

相關推薦

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

貪心演算法-整數區間 【題目描述】  我們定義一個整數區間[a,b],a,b是一個從a開始至b 結束的連續整數的集合。編一個程式,對給定的 n個區間,找出滿足下述條件的所含元素個數最少的集合中元素的個數:對於所給定的每一個區間,都至少有兩個不同的整數屬於該集合。(1

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

一、題目描述 給n個區間,形式為[a, b],a和b均為整數,且a < b。 求一個最小的整數點的集合,使得每個區間至少2個不同的元素(整數點)屬於這個集合。 求這個集合的元素個數。 輸入 第1

Java:演算法 - 整數區間求素數

題目:判斷101-200之間有多少個素數,並輸出所有素數。 程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。 吐槽:簡單的題,想仔細需要的引數,邏輯,邊界控制,爭取一次寫對。 程式碼: package com.oz.

貪心演算法-求區間至少連續k的最大和

題意:對於一個整數n,表示該區間整數的個數,求至少有k個連續的數是該區間中一段的最大和。 n的範圍在1~10^6。k(-1000~1000); 分析:這道題看似有點像樹狀陣列,但要想求出區間至少有k個連續的數的和是最大,恐怕是有點難度,頂多是求某一區間的和。 不過可以沿著這

UVA 1193 貪心演算法區間不交叉)

http://acm.hust.edu.cn/vjudge/problem/32336/origin 題目大意: 海上有很多島p 現在要在x軸上放置雷達,給出雷達範圍和島的位置,問至少 多少個雷達才可以偵查到全部島。 貪心的想法是把雷達偵查範圍儘量的

貪心演算法區間圖著色問題

CLRS 16.1-3 假設要用很多個教室對一組活動進行排程。我們希望使用盡可能少的教室來排程所有的活動。請給出一個有效的貪心演算法,來確定哪一個活動應使用哪一個教室。 (這個問題也被成為區間圖著色(interval-graph coloring)問題。我們可作出一個區間圖

貪心演算法-選擇不相交區間問題

解法一 按照左區間排序 import java.util.*; public class Zuidabuxiangjiaoshu2 { public static void main(String args[]){ Scanner in=new Scanner(Sys

C/C++ 演算法分析與設計:貪心整數配對)

題目描述 江鳥想到一個有趣的問題:給你N個正整數,你可以將這N個整數按兩個一組的方式成對劃分,當然其中的元素也可以不和其他元素配對劃分。現在的問題是,讓劃分為一對的元素的乘積與未配對的元素相加求和,並且讓和最大。比如:考慮這個集合{0,1,2,4,5,3},如果我們讓{0,3}、{2,5}分別成

看電影(貪心演算法+區間是否重合)

【問題描述】 小王要看電影,但是小王在m-n這段時間內很繁忙,無法看電影,但是小王今天心情非常好,能在任意沒有事情的時間內看電影。 請幫幫小王安排時間,使得他能看到最多的電影。 【輸入形式】 輸入檔案中包含多個測試資料。每個測試資料的第1行為一個正整數N(1<=N<=20),表示電影院週六

整數刪除數字求最小值-貪心演算法 c++實現

#include<iostream> #include<string.h> using namespace std; void calculate(char *a,int k) {     int len=strlen(a);  &nb

區間貪心演算法

區間選點 區間貪心的套路就是對已有資料按某以特定屬性排序,反逐個訪問這些資料,判斷出最優解 數軸上有N個閉區間[Ai, Bi]。取儘量少的點,使得每個區間內都至少有一個點(不同區間內含的點可以是同一個)。什麼是閉區間 輸入 第1行:一個整數N(1 <= N <=100

貪心演算法 最大整數

題目:設有n個正整數,將它們連線成一排,組成一個最大的多位整數。 例如:n=3時,3個整數13,312,343,連成的最大整數為34331213。 又如:n=4時,4個整數7,13,4,246,連成的最大整數為7424613。 輸入:2 12 121 輸出:12121

貪心演算法專題小結——區間相關問題

貪心演算法是一種高效演算法,可以快速得到問題的答案。如果一個問題可以用貪心法解決,那麼它必須具備2條性質:1.具有最優子結構(即問題的最優解包含了子問題的最優解),2.具有貪心選擇性質(即可以通過做出區域性最優選擇來構造全域性最優)。下面總結一下基於貪心演算法的區間問題。

貪心——整數區間

問題 F: 【例6.6】整數區間時間限制: 1 Sec  記憶體限制: 128 MB題目描述請程式設計完成以下任務:1.從檔案中讀取閉區間的個數及它們的描述;2.找到一個含元素個數最少的集合,使得對於每

貪心演算法——最大整數分解最大乘積

/* 設n是正整數。現在要求將n分解為若干互相不同的自然數的和,且是這些自然數的乘積最大。 輸入: 10 輸出: 30*/ 分析:a+b=const ; 則 |a - b |越小,a*b就越大 ----------------------------------------

貪心演算法區間圖著色問題

問題來自演算法導論十六章,使用盡可能少的教室對一系列活動進行排程。 思路,把能相容的活動放在以一個教室。 先把所有活動按結束時間遞增的順序排列,方便以後的迴圈。選取快速排序,期望時間複雜度為nlgn,最壞為n^2.快排我都有點忘記了,但是看了一下演算法導論的圖就

貪心演算法-最大不相交區間數問題

數學模型 數軸上有n個區間[Ai,Bi],要求選擇儘量多的區間,並使得這些區間不存在交集。 解題思路 貪心策略,按照B1<=B2<=B3……的方式進行排序,然後從前向後遍歷區間

整數區間貪心

請程式設計完成以下任務:     1.從檔案中讀取閉區間的個數及它們的描述;     2.找到一個含元素個數最少的集合,使得對於每一個區間,都至少有一個整數屬於該集合,輸出該集合的元素個數。

貪心演算法-----區間覆蓋問題

(一)點覆蓋區間(雷達/灌溉噴頭) 題目描述:假設海岸線是一條無限延伸的直線。陸地在海岸線的一側,而海洋在另一側。每一個小的島嶼是海洋上的一個點。雷達坐落於海岸線上,只能覆蓋d距離,所以如果小島能夠被覆蓋到的話,它們之間的距離最多為d。題目要求計算出能夠覆蓋給出的所有島嶼的

【51NOD—貪心演算法專題】 E 做任務三 區間貪心+不相交子區間最少人數

做任務三  基準時間限制:1 秒 空間限制:131072 KB 分值: 5 B君和m個人一起,要完成n個任務,在這個題中,B君和m個人,什麼都不做。 第i個任務有一個開始時間s[i]和結束時間e[