1. 程式人生 > >2、種樹(trees.pas/c/cpp)貪心

2、種樹(trees.pas/c/cpp)貪心

 

2、種樹(trees.pas/c/cpp)

   【問題描述】

    一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號為l…n。每個塊的大小為一個單位尺寸並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b≤e,居民必須保證在指定地區不能種多於地區被分割成塊數的樹,即要求t≤e-b+1,允許居民想種樹的各自區域可以交叉。出於資金短缺的原因,環保部門請你求出能夠滿足所有居民的要求,需要種樹的最少數量。

   【檔案輸入】

    第一行為n,表示區域的個數;第二行為h,表示房子的數目;下面h行描述居民的需要:b e t(0<b≤e≤30000,r≤e-b+l)分別用一個空格分開。

【檔案輸出】

輸出為滿足所有要求的最少樹的數量。

【樣飼輸入】

9

4

1 4 2

4 6 2

8 9 2

3 5 2

【樣例輸出】

5

【資料規模】

30%的資料滿足0<n≤1000,0<h≤500;100%的資料滿足n≤30000,h≤5000。

   【方法一】貪心

    題目中要求要種樹種得少,就要使一棵樹給多個區間使用,這樣,儘量在重疊區間種樹即可,而重疊位置一定是區間尾部。處理問題時,先按所有區間的結束位置排序,若結束位置相同,則按開始位置從大到小排序。之後依次處理每個區間,先在第一個區間尾部種滿足要求的樹,對下一個區間,看差多少棵就在該區間尾部種多少。

    【演算法步驟】

    1、先快排

    2、對每個區間依次處理

      a、從前到後掃描這個區間,統計點的個數;

      b、若點的個數超過了要求的點數,則continue,

      c、從該區間後向前掃描,新增覆蓋點。

    3、輸出ans

var a:array[0..50000] of boolean;
b,e,t:array[0..5000] of longint;
n,h,i,j,k,sum:longint;
procedure swap(var x,y:longint);
var k:longint;
begin
 k:=x; x:=y; y:=k;
end;
procedure f(l,r:longint);
var i,j,k,x,y:longint;
begin
 i:=l; j:=r; x:=e[(i+j) div 2]; y:=b[(i+j) div 2];
 repeat
  while (e[i]<x) or ((e[i]=x) and (b[i]<y)) do inc(i);
  while (e[j]>x) or ((e[j]=x) and (b[j]>y)) do dec(j);
  if i<=j then
   begin
    swap(b[i],b[j]); swap(e[i],e[j]); swap(t[i],t[j]);
    inc(i); dec(j);
   end;
 until i>j;
 if i<r then f(i,r);
 if l<j then f(l,j);
end;
begin
 assign(input,'tree.in'); assign(output,'tree.out');
 reset(input); rewrite(output);
 readln(n);
 readln(h);
 for i:=1 to h do
  readln(b[i],e[i],t[i]);
  f(1,h);
 for i:=1 to h do
  begin
  for j:=b[i] to e[i] do if a[j] then dec(t[i]);
  k:=e[i];
  for j:=1 to t[i] do
   begin
    while a[k] do dec(k);
    a[k]:=true; inc(sum);
   end;
  end;
 writeln(sum);
 close(input); close(output);
end.

相關推薦

2種樹trees.pas/c/cpp貪心

  2、種樹(trees.pas/c/cpp)    【問題描述】     一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號為l…n。每個塊的大小為一個單位尺寸並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個

2獻給阿爾吉儂的花束(flower.pas/c/cpp)

(2)獻給阿爾吉儂的花束(flower.pas/c/cpp) 【描述】 阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各種各樣的迷宮。今天它要挑戰一個非常大的迷宮,研究員們為了鼓勵阿爾吉儂儘快到達終點,就在終點放了一塊阿爾吉儂最喜歡的乳酪。現在研究員們想知道,如果阿爾吉儂足夠聰明,它最少

1仙島求藥(lake.pas/c/cpp)

(1)仙島求藥(lake.pas/c/cpp) 【問題描述】 少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則

Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)A,B,C,D

A. 水題,不多說。 /**/ #include <cstdio> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include

2DMLData Manipulation Language資料操縱語言

      INSERT INTO 表名(欄位名,欄位名) VALUES (值,值);     DELETE FROM 表名 WHERE 條件(oracal中就可以不要from)    

2陣列線性表特點和應用分析

   在計算機記憶體組織中,只有兩種資料儲存的基本方式:陣列和連結串列。 <1>陣列管理 int a[100]; //就是在記憶體中申請100個連續的sizeof(int)空間。 int *p = malloc(100*sizeof(int)); //在堆中

(4)碎紙機(p.pas/c/cpp)

(4)碎紙機(p.pas/c/cpp) 【描述】 你現在負責設計一種新式的碎紙機。一般的碎紙機會把紙切成小片,變得難以閱讀。而你設計的新式的碎紙機有以下的特點: 1.每次切割之前,先要給定碎紙機一個目標數,而且在每張被送入碎紙機的紙片上也需要包含一個數。 2.碎紙機切出的每個紙片上都包括一個

Codeforces Round #493 (Div. 2) A B C D

A. Balloons題目大意:讓你把所有的氣球分成兩份,使得兩份的數量不同,隨便分。解題思路:用一個結構體存數量和序號,在根據數量排個序,對於n<=2進行特判下,對於n>2的情況直接輸出1和第一個數的序號即可。AC程式碼:struct node { in

Codeforces Round #271 (Div. 2) D. Flowers 遞推 預處理

int art style eve itl which pop 有一種 esp We saw the little game Marmot made for Mole‘s lunch. Now it‘s Marmot‘s dinner time and, as we

Android 音頻采集——MediaRecord編碼後錄影文件 AudioRecordPCM原始數據

listen ext 根據 任務 nbsp too 影響 按鈕 red http://blog.csdn.net/java_android_c/article/details/52619737 Android 音頻簡介 常見的音頻編解碼的類型:AAC OPUS MP3

HDU 6050 17多校2 Funny Function數學+乘法逆元

for each -- pac 目前 .cn ron rst input style Problem Description Function Fx,ysatisfies:For given integers N and M,calculate Fm,1 modulo 1e

性能提速:debounce防抖throttle節流/限頻

mat 控制臺 nim 分享圖片 ons 布局 settime why 交互 debounce與throttle是用戶交互處理中常用到的性能提速方案,debounce用來實現防抖動,throttle用來實現節流(限頻)。那麽這兩個方法到底是什麽(what)?為何要用(why

[轉]opencv3 圖像處理 之 圖像縮放 python與c++實現

space original 註意 libs 波紋 輸出 uil iostream 3.5 轉自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函數介紹 1) 圖像大小變換 cvResize () 原型: void

weekend及反位數第一次c++作業

gpo 分享圖片 http inf com 第一次 png clas ima 總結:將endl打成了end1weekend及反位數(第一次c++作業)

異常處理模塊包時間模塊subprocess調用shell命令

模塊異常處理 捕捉異常可以使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。如果你不想在異常發生時結束你的程序,只需在try裏捕獲它。 更多的異常關鍵字:http://www.runoob.com/python/python-exce

軟體測試第三次作業WordCount的C#實現

wordCount的c#實現 合作者:201631092112      ,    201631092126 碼雲(gitee)地址:https://gitee.com/ulysses497/wordCount 本次作業地址:https://edu.cn

實現一個棧,要求實現Push出棧Pop入棧Min返回最小值的時間複雜度為O1

這道題考查棧的知識點,要求實現一個棧,在對這個棧進行入棧和出棧以及返回最小棧元素時要求時間複雜度為O(1)。 方法一: 用兩個棧,一個正常出入棧,另一個存最小棧,入棧的時候第一個站正常入,最小棧如果為空或者要入的data比最小棧的棧頂元素小的時候才給最小棧入棧。

Oracle10.2 補丁安裝轉載略有修改

1.修改p6880880_102000_Linux-x86-64.zip檔案許可權,   chown oracle:oinstall p6880880_102000_Linux-x86-64.zip   2.用oracle使用者將p6880880_102000_Linux-x86

Android 呼叫相機相簿適配6.0

又好久沒有寫部落格了,好習慣不能斷,該寫點就得寫點,今天帶來的筆記是關於Android 專案呼叫系統相機 與呼叫系統相簿的之後拿到照片的基本操作,我感覺好多人還是不太熟悉的哈。專案相容 Android 5.0裝置、Android 6.0裝置、Android 7.0、Android 8.0

使用vue+element實現表格的新增編輯含下拉框刪除功能Vue開發二

幾天前,需要做一個需求:新增一個xml檔案時,新增數量不確定、屬性相同的xml標籤,想了想可以用表格做啊,屬性相同,使用統一的表頭,下面的屬性值只是進行增刪改不就行了,就類似於mysql給表裡填資料一樣。 可是目前似乎還沒有表格的直接增刪改一行的操作,那要怎麼實現呢?於是,通過上網以及自己的思考