2 条题解

  • 1
    @ 2026-9-19 16:18:44
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct grass{
    	int x,y;
    }g[150001];
    int n,f[150001];
    bool cmp(grass a,grass b){
    	return a.y<b.y;
    }
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>g[i].x>>g[i].y;
    	sort(g+1,g+n+1,cmp);
    	for(int i=1;i<=n;i++){
    		f[i]=g[i].y-g[i].x+1;
    		for(int j=1;j<i;j++){
    			if(g[j].y<g[i].x) f[i]=max(f[i],f[j]+(g[i].y-g[i].x+1));
    			else f[i]=max(f[i],f[j]);
    		}
    	}
    	cout<<f[n];
    }
    
    
    
    • -2
      @ 2023-3-22 22:20:44

      乍一看题,切~不就一垃圾动归题吗,分分钟搞定的事!

      #include<iostream>
      #include<algorithm>
      using namespace std;
      struct grass{
      	int x,y;
      }g[150001];
      int n,f[150001];
      bool cmp(grass a,grass b){
      	return a.y<b.y;
      }
      int main(){
      	cin>>n;
      	for(int i=1;i<=n;i++) cin>>g[i].x>>g[i].y;
      	sort(g+1,g+n+1,cmp);
      	for(int i=1;i<=n;i++){
      		f[i]=g[i].y-g[i].x+1;
      		for(int j=1;j<i;j++){
      			if(g[j].y<g[i].x) f[i]=max(f[i],f[j]+(g[i].y-g[i].x+1));
      			else f[i]=max(f[i],f[j]);
      		}
      	}
      	cout<<f[n];
      }
      
      结果,有17个TLE……

      花了一天时间去研究啊,发现可以优化一下,变成一段饲料的选或不选。如果选的话,与之相重复的饲料就不能选了,选与它没重复的吃;如果不选的话,选与它重复的吃。当然,这里不会有状态转移方程,因为我不会写因为大家也看不懂,我也就不写了。

      代码如下(这不是正解!!):
      #include<iostream>
      #include<algorithm>
      using namespace std;
      struct grass{
      	int x,y;
      }g[150001];
      int n,f[150001];
      bool cmp(grass a,grass b){
      	return a.y<b.y;
      }
      int main(){
      	cin>>n;
      	for(int i=1;i<=n;i++) cin>>g[i].x>>g[i].y;
      	sort(g+1,g+n+1,cmp);
      	f[0]=0;
      	for(int i=1;i<=n;i++){
      		int j=i,num=g[i].y-g[i].x+1;
      		while(!(g[j].y<g[i].x||j<1)) j--;
      		f[i]=max(f[i-1],f[j]+num);
      	}
      	cout<<f[n];
      }
      

      上面这段代码之所以没全AC,是因为找第一个没与其重复的饲料段花了超长的时间,

      浪费时间,浪费内存

      后来想了想,感觉找第一个没与其重复的饲料段有点像二分,便用二分的方式优化了下代码:

      #include<iostream>
      #include<algorithm>
      using namespace std;
      struct grass{
      	int x,y;
      }g[150001];
      int n,f[150001];
      bool cmp(grass a,grass b){
      	return a.y<b.y;
      }
      int two_fen(int l,int r,int x){
      	while(l<r){
      		int mid=l+r+1>>1;
      		if(g[mid].y<x) l=mid;
      		else r=mid-1;
      	}
      	return l;
      }
      int main(){
      	cin>>n;
      	for(int i=1;i<=n;i++) cin>>g[i].x>>g[i].y;
      	sort(g+1,g+n+1,cmp);
      	f[0]=0;
      	for(int i=1;i<=n;i++){
      		int num=g[i].y-g[i].x+1;
      		int j=two_fen(0,i-1,g[i].x);
      		f[i]=max(f[i-1],f[j]+num);
      	}
      	cout<<f[n];
      }
      

      完成啦!芜湖!

      良心题解,给个赞吧

      • 1

      信息

      ID
      1410
      时间
      1000ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      122
      已通过
      23
      上传者