2 solutions

  • 1
    @ 2025-3-17 13:41:04

    题意

    要求一个长度为n的bool序列a,对于每个正整数ihi \leq h满足j=bieiajti\sum_{j=b_i}^{e_i} a_j \geq t_i,使得i=1nai\sum_{i=1}^na_i最小。

    思路

    首先考虑要使得树的数量最少,那么一棵树的利用率应该最高,那么就应该在重合的地方。而重合的地方势必是一个建议的尾部。

    所以我们直接贪心,根据尾部的前后排序每个建议,然后对于一个建议先看是否满足,没有满足就从后往前种树。

    那么尾部相同怎么办呢?很简单,头部靠后者排名靠后。因为尾部相同,头部靠后者比被靠前者包裹。

    代码

    #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
    @ 2024-12-7 15:42:36
    #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;
    }
    
    • @ 2025-3-17 13:02:58

      题意思路代码三件套呢?说明注释呢?

  • 1

Information

ID
2
Time
1000ms
Memory
512MiB
Difficulty
7
Tags
# Submissions
28
Accepted
9
Uploaded By