cses排序

Ferris Wheel

题目大意

有一个n个数的数组A和一个x, 每次从A中选一个或两个数成为一个小组,这个小组的和要小于等于x, 求最少有几个小组。

题解

从小到大排序,两个指针 i , j i,j i,j分别指向最小和最大,如果 A [ i ] + A [ j ] < = x A[i]+A[j]<=x A[i]+A[j]<=x则让 i , j i,j i,j分为一组,否则 j j j自成一组;

int n,x;
int A[N];
int main()
{
   
    cin>>n>>x;
    for(int i=0;i<n;i++) cin>>A[i];
    sort(A,A+n);
    int i=0,j=n-1;
    int ans=0;
    while(i<j)
    {
   
        if(A[i]+A[j]<=x) {
   
            ans++;
            i++;
            j--;
        }else{
   
            j--;
            ans++;
        }
    }
    if(i==j) ans++;
    cout<<ans;
    return 0;
}

Restaurant Customers (求最大重叠区间)

题目大意

有n个区间,求最大重叠区间

题解

其中,区间 [ a , b ] [a,b] [a,b]与区间 [ b , c ] [b,c] [b,c]不算在b点不算重叠。

将所有点(包括左右端点)一起拉通形成2n个点排序,遇到左端点则ans+=1,遇到右端点则ans-=1.

#include <bits/stdc++.h>
using namespace  std;
 
const int N = 200005;
 
int n,m;
pair<int,int> A[2*N];
int main()
{
   
    cin>>n;
    for(int i=0;i<2*n;i+=2) {
   
        cin>>A[i].first;
        cin>>A[i+1].first;
        A[i].second=1;
        A[i+1].second=-1;
    }
    sort(A,A+2*n);
    int ans=0;
    int sum=0;
    for(int i=0;i<2*n;i++){
   
        sum+=A[i].second;
        ans=max(ans,sum);
    }
    cout<<ans;
 
    return 0;
}

Room Allocation 最大重叠区间数,且求出每个区间的分配

题目大意

求最大重叠区间数,还要求出具体的分配方案。

题解

按区间从小到大排序,然后维护下已分配的一个结果,每当遍历到当前区间时,看能不能加入已分配的结果中,不能的话就ans++,可以的话就加入到那个结果中。并维护下已分配的结果。这里用的优先队列维护的。

#include <bits/stdc++.h>
using namespace  std;
 
#define 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值