【演算法筆記】 關於簡單貪心的詳細解釋
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 =