2 solutions
-
1
题意
要求一个长度为n的bool序列a,对于每个正整数满足,使得最小。
思路
首先考虑要使得树的数量最少,那么一棵树的利用率应该最高,那么就应该在重合的地方。而重合的地方势必是一个建议的尾部。
所以我们直接贪心,根据尾部的前后排序每个建议,然后对于一个建议先看是否满足,没有满足就从后往前种树。
那么尾部相同怎么办呢?很简单,头部靠后者排名靠后。因为尾部相同,头部靠后者比被靠前者包裹。
代码
#include<iostraem> #include<algorithm> using namespace std; class s{ public: int b,e,t; bool operator<(s a){ if(e==a.e){ return b>a.b; } return e<a.e; } }; int main(){ int n,h; cin>>n>>h; bool t[n+1]{}; s a[h+1]; for(int i=1;i<=h;i++){ cin>>a[i].b>>a[i].e>>a[i].t; } sort(a+1,a+h+1); for(int i=1;i<=h;i++){ int need=a[i].t; for(int j=a[i].b;j<=a[i].e;j++){ need-=t[j]; } if(need>0){ for(int j=a[i].e;need;j--){ if(!t[j]){ t[j]=true; need--; } } } } int ans=0; for(int i=1;i<=n;i++){ ans+=t[i]; } cout<<ans; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; const int maxn=33000; int n,h,cnt; struct advice{ int b,e,t; }adv[maxn]; bool rd[maxn]; bool cmp(advice a,advice b){ return a.e<b.e; } int is_full(int a,int b,int t){ int ans=0; for(int i=a;i<=b;i++){ if(rd[i]==1){ ans++; } } return ans; } int main(){ cin>>n>>h; for(int i=1;i<=h;i++){ cin>>adv[i].b>>adv[i].e>>adv[i].t; } sort(adv+1,adv+h+1,cmp); //for(int i=1;i<=h;i++){ // cout<<adv[i].b<<' '<<adv[i].e<<' '<<adv[i].t<<'\n'; //} for(int i=1;i<=h;i++){ int b=adv[i].b; int e=adv[i].e; int t=adv[i].t; if(is_full(b,e,t)>=t){ continue; } else{ t-=is_full(b,e,t); while(t>0){ if(rd[e]==0){ cnt++; rd[e]=1; t--; } e--; } //for(int k=1;k<=n;k++){ // cout<<rd[k]<<' '; //} //cout<<'\n'; } } cout<<cnt; return /*164*/0; }
- 1
Information
- ID
- 2
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 7
- Tags
- # Submissions
- 28
- Accepted
- 9
- Uploaded By