1. 程式人生 > >問題 B: 【貪心】種樹(Java排序方式練習+樹狀陣列)

問題 B: 【貪心】種樹(Java排序方式練習+樹狀陣列)

問題 B: 【貪心】種樹

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 105  解決: 49
[提交] [狀態] [討論版] [命題人:admin]

題目描述

 一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1..N。每個部分為一個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼B,E,T。這三個數表示該居民想在B和E之間最少種T棵樹。當然,B≤E,居民必須記住在指定區不能種多於區域地塊數的樹,所以T≤E-B+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量。

寫一個程式計算最少要種樹的數量。

輸入

第一行包含資料N,區域的個數(0<N≤30000);
第二行包含H,房子的數目(0<H≤5000);
下面的H行描述居民們的需要:B E T,0<B≤E≤30000,T≤E-B+1。

輸出

樹的數目。

樣例輸入

9
4
1 4 2
4 6 2
8 9 2
3 5 2

樣例輸出

5

[提交][狀態]

【分析】

按右端點排序,然後掃描每個區間,優先從右端點處往左貪心種樹,種到夠數即可。這樣就能儘量幫助後面的區間種一些樹。

【程式碼】

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class node{
	public int x,y,w;
	node()
	{
		x=y=w=0;
	}
}

class cmp implements Comparator<node>{  //重寫node的排序規則
	@Override
	public int compare(node a,node b) //返回-1是正向排序
	{
		if(a.y<b.y)return -1;  //先按y從小到大排序
		else if(a.y>b.y)return 1; 
		else if(a.x>b.x)return -1; //y相等時按x從大到小
		else if(a.x<b.x)return 1;
		return 0;  //完全相等返回0
	}
}
public class Main {
	final static int MAX=30001;
	static int[] btree=new int[MAX];
	public static void add(int k,int num,int top)
	{
		for(;k<=top;k+=k&-k)
			btree[k]+=num;
	}
	public static int read(int k)
	{
		int res=0;
		for(;k>0;k-=k&-k)
			res+=btree[k];
		return res;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		for(int i:btree)i=0;
		int n=in.nextInt();
		int k=in.nextInt();
		node p[]=new node[k]; //相當於申請了k個node的指標
		for(int i=0;i<k;i++)
		{
			p[i]=new node(); //物件陣列一定要每個元素賦一個空間
			p[i].x=in.nextInt();
			p[i].y=in.nextInt();
			p[i].w=in.nextInt();
		}
		Arrays.sort(p,new cmp());  //按照cmp規定排序
		for(int i=0;i<k;i++)
		{
			int pos=p[i].y;
			while(read(p[i].y)-read(p[i].x-1)<p[i].w)
			{
				if(read(pos)-read(pos-1)==0)
					add(pos,1,5000);
				pos--;
			}
		}
		System.out.println(read(5000));
	}
}

相關推薦

問題 B: 貪心種樹Java排序方式練習+陣列

問題 B: 【貪心】種樹 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 105  解決: 49 [提交] [狀態] [討論版] [命題人:admin] 題目描述  一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編

bzoj2151種樹堆/優先隊列+雙向鏈表

getc lin pos return tar ror del 刪掉 位置   題目傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=2151   這道題因為優先隊列不怎麽會用,而且手寫堆的代碼也不長,也想復習一下手寫

CF869EThe Untended Antiquity雜湊+二維陣列

當覆蓋兩點的最小矩形不同時,一定不可達 這樣的問題不難想到經典的二維樹狀陣列+差分來支援二維區間覆蓋+查詢 對於覆蓋操作 我們可以差分的給這個矩陣里加上一個編號 對於操牆操作 我們可以反著減去這個編號 對於查詢 就查詢這兩個點的值是否相同 編號的累積不影響 因為只有在同一個牆內才會累積 注意 如果只是單單的把

BZOJ2434 阿狸的打字機題解AC自動機+dfs序+陣列

題目:BZOJ2434. 題目大意:有三個操作: 1.加入一個字元. 2.刪除一個字元. 3.將當前字串記錄下來. 設將所有記錄下來的字串標上標號1~n,給出一些詢問,每次詢問(x,y)表示詢問第x個字串在第y個字串中出現的次數. 這道題即使告訴了我是dfs序我也沒想到離線… 首

codeforces DIV2 E. Garlands 離線、二維陣列

題意: 給出你一個n*m矩陣,矩陣中有一些燈泡,這些燈泡連成了k條互不重疊的鏈。每個燈泡都有一定的權值w,但是隻有當燈泡開啟的時候,才會產生貢獻,剛開始所有的燈泡都是開著的。共有q次詢問,有兩種操作: ①“Switch i”——表示將編號為i的

*貪心種樹**

【貪心】種樹 一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1…N。每個部分為一個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼B,E,T。這三個數表示該居民想在B和E之間最少種T棵樹。當然,B≤E,居民必須記住在指定區不能種

問題 B: 貪心電視節目安排

問題 B: 【貪心】電視節目安排 時間限制: 1 Sec 記憶體限制: 64 MB 提交: 218 解決: 119 [提交] [狀態] [討論版] [命題人:admin] 題目描述 李旭琳發現小墨老師在班上是最頑劣的學生(沒有之一),但他也有安靜的時候,例如在看電視的時候。像什麼“諜戰劇”啊

LeetCode771JavaJewels and Stones

    You're given strings J representing the types of stones that are jewels, and S representing the stones you have.  Each character in S 

LeetCode709JavaTo Lower Case

Question: Implement function ToLowerCase() that has a string parameter str, and returns the same string in lowercase. 實現函式ToLowerCase st

BZOJ2959長跑Link-Cut Tree,並查集

php www main inline body lin maker www. ota 【BZOJ2959】長跑(Link-Cut Tree,並查集) 題面 BZOJ 題解 如果保證不出現環的話 妥妥的\(LCT\)傻逼題 現在可能會出現環 環有什麽影響? 那就可以沿著環把

BZOJ2555SubString後綴自動機,Link-Cut Tree

cstring 一個 put ostream bzoj2555 subst get ini void 【BZOJ2555】SubString(後綴自動機,Link-Cut Tree) 題面 BZOJ 題解 這題看起來不難 每次要求的就是\(right/endpos\)集合的

BZOJ1008越獄排列組合計數,容斥原理

code typedef ostream ima bzoj1008 image sca fin space 題意: 思路: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<ios

BZOJ3712Fiolki並查集重構

bzoj3 long std 不同 合並 ++i 卡爾 優先級 href 【BZOJ3712】Fiolki(並查集重構樹) 題面 BZOJ 題解 很神仙的題目。 我們發現所有的合並關系構成了一棵樹。 那麽兩種不同的東西如果產生反應,一定在兩個聯通塊恰好聯通的時候反應。 那麽

BZOJ2762[JLOI2011]不等式組陣列

題目: 分析: 加入的不等式分三種情況 當a>0a>0,可以變成x>⌊c−ba⌋x>⌊c−ba⌋ 當a=0a=0,若b>cb>c則恆成立,否則恆不成立 當a<0a<0,可以變成x<⌈c−ba

2018.09.26TJOI2017BZOJ4888洛谷P3760異或和陣列差分

洛谷傳送門 解析: 額,TJOITJOITJOI連續兩年考了位運算。。。 我還能說什麼。。。 PS:zxyoiPS:zxyoiPS:zxyoi不是天津oieroieroier。 思路: 一般位運算都

2018.10.23校內模擬行星通道計劃二維陣列

傳送門 解析: 我們發現,每一條線段會把原來的環狀分成兩段,兩條線段有交點當且僅當一條線段的起終點分別在另一條線段把環形分成的兩個部分中。 所以直接斷環成鏈,每次新加線段&lt;u,v&gt;&lt;u,v&gt;<u,v

poj 3468 A Simple Problem with Integers 區間修改+區間查詢陣列

參考下面部落格的公式: 需要注意的是,輸入初始數列的時候要 add 兩次, L = R, add (L, x), add (R+1, -x) #include <iostream>

WC2018通道邊分治,虛,動態規劃

【WC2018】通道(邊分治,虛樹,動態規劃) 題面 UOJ 洛谷 題解 既然是三棵樹,那麼顯然就是找點什麼東西來套個三層。 一棵樹怎麼做?入門dp。 兩棵樹?假設在第一棵樹中的深度為\(dep\)。在第一棵樹中列舉\(LCA\),因為兩點之間距離可以轉化為兩點深度和減去兩倍\(LCA\)的深度,

BZOJ4184Shallot線性基,線段分治

Description 可支援插入、刪除、求最大異或值的線性基。 Solution 插入、求最大異或值都比較基礎。 其實刪除也是套路吧,,直接建一棵時間線段樹即可。 Code /