您的位置:首页 > 其它

hdu 4268 Alice and Bob(STL贪心)

2013-05-02 20:52 127 查看
题解:

对Alice和Bob的数据一起排序,再贪Alice离Bob最进的矩形

做了整整一个下午,我晚饭后找了一会,还是没发现,

一筹莫展之际,只有使出杀手锏(求教飞机哥!!!)

正在注释代码准备求助时,终于的发现了坑货的小bug!!!!

( bool cmp()中忘写了return false;以前使用int cmp())

1。起初是直接查找TLE,各种换数据结构。

2。数组开100005提交,Runtime Error
(ACCESS_VIOLATION)

又百度,此错误好像有爆内存的原因(明明就够题目数据量的??)。

3。最后还得请教baidu先生,找到

iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。

[b]iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> key的第一个元素。[/b]

#include<stdio.h>
#include<list>
#include<set>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int w,h,flag;//0 B;1 A;
}a[200005];
//list<node>s;
//list<node>::iterator it;
set<int>s;
set<int>::iterator it;
bool cmp(node b,node c)
{
if(b.w<c.w)return true;
else if(b.w>c.w)return false;
else if(b.h<c.h)return true;
else if(b.h<c.h)return false;
else if(b.flag<c.flag)return true;//small falg in the front
return false;
}//按依次按宽度,高度,(完全相同)则B在A前排序
int main()
{
int _case,n,m,x;
scanf("%d",&_case);
while(_case--)
{
//memset(a,0,sizeof(a));
s.clear();
scanf("%d",&n);
m=n*2;
for(int i=0;i<m;i++)
{
scanf("%d %d",&a[i].h,&a[i].w);
a[i].flag=1-i/n;
}
sort(a,a+m,cmp);
//x=0;
for(int i=0;i<m;i++)
{
if(a[i].flag==0)
//s.push_front(a[i]);
s.insert(a[i].h);
else if(s.size())
{
/*for(it=s.begin();it!=s.end();it++)
{
if((*it).h<=a[i].h)
{
s.erase(it);
break;
}
}*/
if(a[i].h<*s.begin())continue;
it=s.upper_bound(a[i].h);//用lower_bound()也正确,数据有点弱

it--;//删除前一个,最近的覆盖//x++;
s.erase(it);
}
//printf("%d %d\n",i,s.size());
}
printf("%d\n",n-s.size());
}
return 0;
}


鉴于爆内存的错误,写了vector的程序;

#include<stdio.h>
#include<list>
#include<set>
#include<vector>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int w,h,flag;//0 B;1 A;
}p;
vector<node>a;
set<int>s;
set<int>::iterator it;
bool cmp(node b,node c)
{
if(b.w<c.w)return true;
else if(b.w>c.w)return false;
else if(b.h<c.h)return true;
else if(b.h<c.h)return false;
else if(b.flag<c.flag)return true;//small falg in the front
return false;
}
int main()
{
int _case,n,m;
//int x,y;
scanf("%d",&_case);
while(_case--)
{
//memset(a,0,sizeof(a));
a.clear();
s.clear();
scanf("%d",&n);
m=n*2;
for(int i=0;i<m;i++)
{
scanf("%d %d",&p.h,&p.w);
p.flag=1-i/n;
a.push_back(p);
//a[i].w=y;
}
sort(a.begin(),a.end(),cmp);
for(int i=0;i<m;i++)
{
if(a[i].flag==0)
s.insert(a[i].h);
else if(s.size())
{
if(a[i].h<*s.begin())continue;
it=s.lower_bound(a[i].h);//用upper_bound()也正确
it--;
//x++;
s.erase(it);
}
//printf("%d %d\n",i,s.size());
}
printf("%d\n",n-s.size());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: