6 条题解

  • 5
    @ 2022-7-18 17:01:54

    这是什么power??

    #include<bits/stdc++.h>
    using namespace std;
    struct t {
    	int sta,end;
    } a[10086]; //结构体(不用的话可以再压行)
    bool cmp(t a,t b) {return a.end<b.end;}//将末尾从小到大排序
    int main() {
    	int n,sum=0;
    	cin>>n;
    	for(int i=1; i<=n; i++)
    		cin>>a[i].sta>>a[i].end;//输入语句
    	sort(a+1,a+1+n,cmp);//排序
    	for(int i=1,t=-1; i<=n; i++)
    		if(a[i].sta>=t) {sum++;t=a[i].end;}
    	cout<<sum;
    }
    

    18行16行 这个代码看起来这么吊的原因大部分是在for(int i=1,t=-1;i<=n;i++){ if(a[i].sta>=t){sum++;t=a[i].end;} }上。那为什么这么吊呢? 在输入排序后大概就有这样的感觉

    1 3

    5 4

    2 5

    6 7

    有点合并区间的味道。 将t定义为负数,来帮助录入a[1].sta。第一个数的末尾总是最小的。更新t。之后只要a[i].sta>=t(参考题目)就再次更新t。

    • @ 2022-7-19 8:13:25

      我超,牛蛙❤️

  • 3
    @ 2022-7-19 15:31:08
    using namespace std;
    struct p{
    	int l1;
    	int r1;
    }sh[1000000];
    bool cmp(p a,p b){
    	return a.r1<b.r1;
    }
    int main(){
    	int n;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>sh[i].l1>>sh[i].r1;
    	}
    	sort(sh+1,sh+1+n,cmp);
    	//for(int i=1;i<=n;i++)cout<<sh[i].r1;
    	
    	int l=sh[1].l1;
    	int r=sh[1].r1;
    	int ans=1;
    	for(int i=2;i<=n;i++){
    		if(sh[i].l1<r){
    			continue;
    		}
    		else {
    			ans+=1;
    			l=sh[i].l1 ;
    			r=sh[i].r1;
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    • @ 2022-7-19 15:48:37

      没考虑结束时间相等时,起始时间不同

    • @ 2022-7-19 15:56:21

      和原来一样,只是分开讨论了

      using namespace std;
      struct p{
      int l1;
      int r1;
      }sh[1000000];
      bool cmp(p a,p b){
      return a.r1<b.r1;
      }
      int main(){
      int n;
      cin>>n;
      for(int i=1;i<=n;i++){
      cin>>sh[i].l1>>sh[i].r1;
      }
      sort(sh+1,sh+1+n,cmp);
      int l=sh[1].l1;
      int r=sh[1].r1;
      int ans=1;
      for(int i=2;i<=n;i++){
      if(sh[i].l1<r){
      continue;
      }
      if(sh[i].l1==r){
      if(sh[i].r1>r){
      l=sh[i].l1 ;
      r=sh[i].r1;
      ans++;
      }
      }
      else {
      ans+=1;
      l=sh[i].l1 ;
      r=sh[i].r1;
      }
      }
      cout<<ans;
      return 0;
      }
      
      
      
    • @ 2022-7-19 15:56:51

      @ 其实差不多👀️

  • 2
    @ 2022-7-19 10:33:14

    一本通p268

    using namespace std;
    const int N=1001;
    int beginn[N],endd[N];
    int main()
    {
    	int n,sum=0;
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	cin>>beginn[i]>>endd[i];
    	for(int i=1;i<=n-1;i++)
    	{
    		for(int u=1;u<=n-2;u++)
    		{
    			if(endd[u]>endd[u+1])
    			{
    				swap(endd[u],endd[u+1]);
    				swap(beginn[u],beginn[u+1]);
    			}
    		}
        }
        for(int i=1,t=-1;i<=n;i++)
        {
        	if(beginn[i]>=t)
        	{
        	    sum++;
        	    t=endd[i];
    		}
    	}
    	cout<<sum;
    	return 0;
    }
    
    • 1
      @ 2022-11-24 20:44:09

      先排序。这题应该以结束时间为标准降序排,如果开始时间和last重复了就跳掉,如果兼容就变掉last。

      #include<bits/stdc++.h>
      using namespace std;
      int last,k,t=1,tf[10000],te[10000],j=2;
      
      void qs(int l,int r)//二分思想排序
      {
          int i=l,j=r,mid=te[(l+r)/2];
          while (i<=j){
              while (te[i++]<mid);
              while (mid<te[j--]);
              i--;j++;
              if (i<=j){swap(te[i++],te[j--]);swap(tf[i-1],tf[j+1]);}
          }
          if (l<j){qs(l,j);}
          if (i<r){qs(i,r);}
      }
      
      int main()
      {
      	cin>>k;
      	for (int i=1;i<=k;i++){
              cin>>tf[i]>>te[i];
      	}
      	qs(1,k);
      	last=te[1];
      	while (te[j]!=0){
              if (tf[j++]>=last){t++;last=te[j-1];}
      	}
      	cout<<t;
      }
      

      最后再说一遍,我是lxsh的狗!

      • 0
        @ 2023-4-1 17:45:29

        大抵就是这样了。👀️

        struct node
        {
        	int s,e;
        }a[1100];
        bool cmp(node x,node y)
        {
        	return x.e<y.e;
        }
        int main()
        {
            int ans=1,t,n,i;
        	scanf("%d",&t);
        	for(i=1;i<=t;i++)
        	scanf("%d%d",&a[i].s,&a[i].e);
        	sort(a+1,a+t+1,cmp);
        	n=a[1].e;
        	for(i=2;i<=t;i++)
        	{
        		if(a[i].s>=n)
        		{
        			ans++;
        			n=a[i].e;
        		}
        	}	
        	printf("%d",ans);
        	return 0;
        }
        
        • 0
          @ 2023-3-30 19:07:43
          #include<bits/stdc++.h>
          using namespace std;
          const int Maxn=1010;
          struct s{//定义开始与结束的结构体
              int begin;
              int end;
          }a[Maxn];
          int k=0;//记录次数
          bool cmp(s x,s y)
          {
              return x.end<y.end;
          }
          int main()
          {
              int n;
              cin>>n;
              for(int i=1;i<=n;i++)
              {
                  cin>>a[i].begin>>a[i].end;
              }
             
              sort(a+1,a+n+1,cmp);//将结构体中的end从小到大排列
              int t=-999;//记录当前区间末尾
              for(int i=1;i<=n;i++)
              {
                 if(a[i].begin>=t)//如果其区间开始时间大于当前选中区间的结束时间
                 {
                  k++;//则合格的区间加1
                  t=a[i].end;//将当前合格的区间的结束时间作为下一组比较的结束时间,之后再与下一组的开始时间比较大小即可
                  
                 }
              }
              cout<<k;
          }
          
          • 1

          信息

          ID
          478
          时间
          1000ms
          内存
          512MiB
          难度
          6
          标签
          递交数
          852
          已通过
          259
          上传者