1. 程式人生 > >【演算法筆記】 關於簡單貪心的詳細解釋

【演算法筆記】 關於簡單貪心的詳細解釋

1.三值排序

貪心策略:統計1,2,3的個數

首先在根據統計的個數規定1,2,3的區間

首先,將1的區間內有3的個數時交換並統計

然後,再在1的區間內找2

最後,在2的區間內找3

奉上pascal程式碼:

program used_pascal;
var n:integer;
    i,j,t,ans:longint;
    a:array[-10..10000] of longint;
    b:array[-10..10000] of longint;
begin
    read(n);
	for i:=1 to n do
	    read(a[i]);
	for i:=1 to n do
	    inc(b[
a[i]]); for i:=1 to b[1] do begin if a[i]=3 then begin for j:=n downto b[1]+1 do if a[j]=1 then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(ans); break; end
; end; if a[i]=2 then begin for j:=b[1]+1 to n do if a[j]=1 then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(ans); break; end; end; end; for i:=b[1]+1 to b[1]+b[2] do if a[
i]=3 then begin for j:=b[1]+b[2]+1 to n do if a[j]=2 then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(ans); break; end; end; write(ans); end.

2.修理牛棚

首先,排序

其次,按間隔排序,由題意可知要-1

最後根據排序結果累加

最後減一減即可

其貪心策略要求木材儘量小,間隔儘量大,自然要通過排序來解決,也就形成了這道題目的貪心策略

非主流程式碼如下(暴露真名惹):

#include<bits/stdc++.h>
using namespace std;
inline bool ZhouYibo_2023_cmp (int x,int y){return x>y;
}
int main()
{
	int h,s,c,k=0;
	int a[10000]={};
	cin>>h>>s>>c;
	for (int i=1;i<=c;i++)
	    cin>>a[i];
	sort(a+1,a+c+1);
	int b[10000]={};
	for (int i=1;i<c;i++)
	    b[i]=a[i+1]-a[i]-1;
	sort(b+1,b+c,ZhouYibo_2023_cmp);
	for (int i=1;i<=h-1;i++)
	    k+=b[i]; cout<<a[c]-a[1]+1-k;
}

3.遊蕩的奶牛

為了使線段後後面部分產生影響,按照右端點

又因為為了使盡量挑長度小的覆蓋,所以相同右端點時起點靠右邊的在前面

//貪心策略:按右端點排序,防止最右邊產生影響 
#include<bits/stdc++.h>
structAC{
	int left,right;
}Line[100000]={};
inline bool cmp(ACx,ACy){return x.right<y.right;}
int n;
using namespace std;
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
	   cin>>Line[i].left>>Line[i].right;
	sort(Line+1,Line+n+1,cmp);
	int now=1,ans=1;
	for (int i=1;i<=n;i+=1)
	{
		if (Line[now].right<=Line[i].left)
		    now=i,
		    ans++;
	} 
	cout<<ans;
	return 0;
}

4.遊蕩的奶牛

同樣,只要變換一下判斷條件,即if語句

原來是:判斷這條線所放的地方有沒有被放過

現在是:判斷這條線所能放的每一個地方被放過的次數是否都<k

#include<bits/stdc++.h>
structAC{
	int left,right;
}Line[100000]={};
inline bool cmp(ACx,ACy){return x.right<y.right ||( (x.right==y.right&&x.left>=y.left) ); }
int n,k;
int num[100000]={};
int answer=0;
using namespace std;
int main()
{
	cin>>n>>k;
	for (int i=1;i<=n;i++)
	{
		int A,C,B;
		cin>>A>>C>>B>>C;
		Line[i].left=min(A,B);
		Line[i].right=max(A,B);
	}
	sort(Line+1,Line+n+1,cmp);
	for (int i=1;i<=n;i++)
	{
		int flag=0;
		for (int Check=Line[i].left;Check<=Line[i].right;Check++)
			if (num[Check]>=k) 
			{
				flag=1;
				break;
			}
		if (flag==1) continue;
		for (int Now=Line[i].left;Now<=Line[i].right;Now++)
		    num[Now]++;
		answer++;
	}
	cout<<n-answer;
	return 0;
}

5.刪數問題

....未完待續

相關推薦

演算法筆記 關於簡單貪心詳細解釋

1.三值排序貪心策略:統計1,2,3的個數首先在根據統計的個數規定1,2,3的區間首先,將1的區間內有3的個數時交換並統計然後,再在1的區間內找2最後,在2的區間內找3奉上pascal程式碼:progr

學習筆記簡單字串演算法 —— 序列自動機

序列自動機是一個比字尾自動機簡單的自動機。字尾自動機可以看神仙 x y z

演算法筆記普里姆Prim演算法簡單實現

前言 由於最近在學習資料結構,在學習的過程中動手把演算法的思路用程式碼的形式實現了,這樣記憶更深刻。所以在此記錄下學習普里姆演算法時,如何通過該演算法獲得連通網的最小生成樹。 演算法實現思路

演算法筆記雜湊(hash)總結

有兩天沒寫部落格了,前兩天刷完了PAT甲級中的雜湊的題目,做一個小小的總結。 雜湊的定義: 將元素通過一個函式轉化成一個整數,使得該整數能夠儘量唯一地代表這個元素。 最常用的雜湊: 對於數字而言,H(key) = key,最常見的用法是某個數字直接作為對於陣列的下標。

演算法筆記二分法的使用(使用目的+模板)

今天看完《演算法筆記》裡二分法這個章節,稍微總結一下。 二分法的思想主要就是折半查詢,達到O(logn)的查詢速度。 使用目的或者說使用情景主要有如下三個,下面將依次介紹。 查詢有序序列中是否存在滿足條件的元素 查詢有序序列中滿足條件的第一個元素 對一些函式進行求根

演算法筆記第六章:C++標準模板庫(STL)介紹

【演算法筆記】第六章:C++標準模板庫(STL)介紹 標籤(空格分隔):【演算法筆記】 第六章:C++標準模板庫(STL)介紹 第六章:C++標準模板庫(STL)介紹 6.1 vector的常見用法詳解

演算法筆記第二章: C/C++ 快速入門

【演算法筆記】第二章: C/C++ 快速入門 標籤(空格分隔):【演算法筆記】 第二章:C/C++ 快速入門 第二章:C/C++ 快速入門 2.0 引言 2.1 基本資料型別

演算法筆記LCA問題-tarjan 離線演算法

reference: 演算法流程: 1)讀入表示父子關係的樹 2)儲存所有詢問 3)一次DFS回答所有詢問 演算法的關鍵是: 對於一個正在訪問中的節點u,其訪問過的子樹加上這個節點本身合併為一個等

演算法筆記動態規劃,三個例題(解題思路與C++程式碼)

寫在前面,我想發個感慨:       當年大學時代ACM的時候,動態規劃演算法對鄙人來說一直算得上魔障,有時能敲出來程式碼,有時候狗咬刺蝟無從下嘴。       以至於一直認為動態規劃是ACM的代表演

演算法筆記回溯法——n皇后問題

回溯法——n皇后問題 問題描述 按照國際象棋的規則,皇后可以攻擊同一行、同一列、同一斜線上的棋子。求n×n格的棋盤上彼此不受攻擊的n個皇后的擺法。 下圖為4皇后問題的一個解: Q Q

演算法筆記資源分配類動態規劃

1.HLOJ#411機器分配 要求資源分配的最大值,我們可以用二維陣列f[i][j]來表示前i個公司得到j臺機器後所得到的最大盈利值。 方程是: f[i][j]=max(f[i][j],f[i-1

基於連通性狀態壓縮的動態規劃--插頭DP模板超級詳細解釋

斷斷續續卡了本公舉三天的插頭dp終於搞完了,貌似好多網友也都是學了好多天才搞懂的,特別用成就感,作為一個模板160+行的dp也是醉了 首先一定要看陳丹琪的論文!一個高中女孩能讓許多大老爺們為難好多天真是厲害,然後我結合孫大神的課件充分理解了模板上的每一句話,哈哈哈,勞資看

NodeJS+Express+MongoDB 簡單個人博客系統Study筆記

修改 exp 文章 edi view 代碼 mage 註釋 存在 Blog 個人博客系統 iBlog是在學習NodeJs時候一個練手項目Demo 系統支持用戶註冊/登錄,內容文章查看,評論,後臺管理(定制顯示的分類版塊,進行文章內容添加)超級管理員還可進行用戶管理等 目前只

學習筆記初識FreeMarker簡單使用

als 大小 宋體 屬性 list mage equal port template 楔子:    之前在和同事討論,同事說“jsp技術太古老了,有幾種頁面技術代替,比如FreeMarker、Velocity、thymeleaf,jsp快廢棄了……”雲雲。我這一聽有點心虛…

Java筆記多執行緒實現簡單的非同步運算

實現Callable介面,重寫call()方法,使操作執行緒池時能帶有返回值的效果: import java.util.concurrent.Callable; public class GetSumCallable implements Callable<Integer> {

機器學習接地氣地解釋K-means聚類演算法

       俗話說“物以類聚,人以群分”,這句話在K-means聚類演算法裡面得到了充分的繼承。而K-means演算法的實際應用範圍可謂是大到無法估量,基本可以說,只要你想不到,沒有聚類聚不起來的東西!       &nbs

學習筆記演算法導論第2章:演算法基礎

//====================================== //Ch2_1_Basic_Sort_Algorthm //====================================== #include<iostream> #

演算法筆記 - 1多項式乘法 —— FFT

目錄 @0 - 參考資料@ @1 - 一些概念@ @2 - 傅立葉正變換@ @3 - 傅立葉逆變換@ @4 - 迭代實現 [email protected] @5 - 參考程式碼實現@ @6 - 快速數論變換 [email protected] @

讀書筆記推薦系統實踐-常見推薦演算法及應用

《推薦系統實踐》系統性地介紹了推薦系統這一領域,思路清晰,詳細介紹了各個領域不同情景的推薦演算法的應用,是一本很好的推薦系統入門書,尤其第二第三章的講解比較細緻。(Ps:書中插入的python程式碼有點生硬,讀者可以直接忽略) 衡量推薦演算法的指標 使

mahout筆記初步理解userCF(基於使用者的推薦演算法)在mahout的實現

昨天嘗試在java中搭建了一個mahout的小demo,實現的就是基於使用者的推薦演算法。程式碼如下(更多程式碼和測試資料庫)參見前一篇: public class RecommendTest { final static int NEIGHBORHOOD_NUM =