【題目描述】一條街道的一邊有幾座房子。因為環保原因居民想要在路邊種些樹,路邊的地區被分割成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;
}