题目地址:HDU 5360
题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须满足c>=l[i]&&c<=ri,问你邀请的顺序是什么才能使尽可能多的人去远足,若有多个最优解,输出任意的一个。
思路:先按照L从小到到排序,把当前符合的L放入优先队列中 ,然后对队列中的R从小到大排序,贪心的选择R小的,然后乱搞一番就可以了。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=1e5+10;
int vis[maxn];
int res[maxn];
struct node
{
int s,e;
int id;
bool operator <(node a) const{
return e>a.e;
}
}a[maxn],t;
priority_queue<node>q;
int cmp(struct node a,struct node b)
{
return a.s<b.s;
}
int main()
{
int T,n,i,j;
int cnt,num;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i].s);
for(i=1;i<=n;i++){
scanf("%d",&a[i].e);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
cnt=0;
num=0;
memset(vis,0,sizeof(vis));
j=1;
for(i=1;i<=n;i++){
while(j<=n&&a[j].s<=cnt){
q.push(a[j]);
j++;
}
while(!q.empty()){
t=q.top();
q.pop();
if(cnt<=t.e){
res[num++]=t.id;
cnt++;
vis[t.id]=1;
break;
}
}
}
cnt=0;
printf("%d\n",num);
for(i=0;i<num;i++){
cnt++;
if(cnt==n)
printf("%d\n",res[i]);
else
printf("%d ",res[i]);
}
for(i=1;i<=n;i++){
if(vis[i]) continue;
cnt++;
if(cnt==n)
printf("%d\n",i);
else
printf("%d ",i);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5360(2015多校6)-Hiking(优先队列)
原文地址:http://blog.csdn.net/u013486414/article/details/47339687