题目大意:
有一个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