标签:
http://acm.hdu.edu.cn/showproblem.php?pid=5360
4 8 4 1 3 2 2 1 0 3 5 3 6 4 2 1 7 6 8 3 3 2 0 5 0 3 6 4 5 2 7 7 6 7 6 8 2 2 3 3 3 0 0 2 7 4 3 6 3 2 2 5 8 5 6 5 3 3 1 2 4 6 7 7 6 5 4 3 5
7 1 7 6 5 2 4 3 8 8 4 6 3 1 2 5 8 7 7 3 6 7 1 5 2 8 4 0 1 2 3 4 5 6 7 8
/**
hdu5360||多校联合第6场1008 贪心
题目大意:xxx要邀请n个人去玩,对于第i个人如果已经邀请的人数在(li,ri)之间,他就会去。问用怎样的邀请顺序能邀请到最多的人?
解题思路:和去年上海亚洲赛的一道题挺像。我的想法是先将n个人以li递增排个序,然后从前往后遍历,当前已经邀请的为x人,在所有
li>=x的的人中取ri最小(set维护)的即可。复杂度O(nlogn)
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
const int maxn=100005;
struct note
{
int l,r,id;
bool operator <(const note &other)const
{
return l<other.l;
}
}a[maxn];
int n,num[maxn],flag[maxn];
set<pair<int,int> >st;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].l);
a[i].id=i+1;
}
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].r);
}
sort(a,a+n);
int x=0;
memset(flag,0,sizeof(flag));
for(int i=0;;)
{
while(x>=a[i].l&&i<n)
{
st.insert(make_pair(a[i].r,a[i].id));
i++;
}
while(((*st.begin()).first<x)&&st.size()>0)st.erase(st.begin());
if(st.size()==0)break;
int cnt=(*st.begin()).second;
num[x++]=cnt;
flag[cnt-1]=1;
st.erase(st.begin());
}
printf("%d\n",x);
for(int i=0;i<n;i++)
{
if(!flag[i])
{
num[x++]=i+1;
}
}
for(int i=0;i<n;i++)
{
printf(i==n-1?"%d\n":"%d ",num[i]);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/47342501