日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贪心算法-区间选点问题-种树

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心算法-区间选点问题-种树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】一條街道的一邊有幾座房子。因為環保原因居民想要在路邊種些樹,路邊的地區被分割成n塊,并被編號為1~n。每塊大小為一個單位尺寸且最多可總一棵樹。每個居民想在門前種些樹并制定了三個數b,e,t,這三個數代表居民想在b和e之間最少種t棵樹,當然b<=e,t<=e-b+1,允許居民想種樹的子區域可以交叉,由于資金短缺的原因,環保部門想請你求出能夠滿足所有居民的種樹要求的書的最少數量。
【輸入格式】 第一行為n,表示區域的個數,第二行為m,表示房子的數目,接下來m行描述居民的需要
(0<b<=e<=30000,t<=e-b+1)
【輸出格式】輸出一個數,表示滿足居民的要求所需要種樹的最小數量
貪心策略:將房子按結束坐標進行排序后,從前往后盡可能地將樹栽到每個區間的末尾,盡可能讓后面的房子共用
代碼:

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;int n,m,k,ans; struct node {int b,e,t; }a[5005]; bool used[30005];bool cmp(const node& a,const node& b) {return a.e<b.e; }int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i].b>>a[i].e>>a[i].t;}sort(a,a+m,cmp);memset(used,0,sizeof(used));ans=0;for(int i=0;i<m;i++){k=0;for(int j=a[i].b;j<=a[i].e;j++){if(used[j]) k++;}if(k>=a[i].t)continue;k=a[i].t-k;for(int j=a[i].e;j>=a[i].b;j--){if(used[j]==false){used[j]=true;ans++;k--;}if(k==0)break;}}cout<<ans;return 0; }

同理按照房子的起始位置開始排序也是可以的
代碼:

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std;int n,m,k,ans; struct node {int b,e,t; }a[5005]; bool used[30005];bool cmp(const node& a,const node& b) {return a.b<b.b; }int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i].b>>a[i].e>>a[i].t;}sort(a,a+m,cmp);memset(used,0,sizeof(used));ans=0;for(int i=m-1;i>=0;i--){k=0;for(int j=a[i].b;j<=a[i].e;j++){if(used[j]) k++;}if(k>=a[i].t)continue;k=a[i].t-k;for(int j=a[i].b;j<=a[i].e;j++){if(used[j]==false){used[j]=true;ans++;k--;}if(k==0)break;}}cout<<ans;return 0; }

總結

以上是生活随笔為你收集整理的贪心算法-区间选点问题-种树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。