| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贪心算法和二分思想的实现In Reply To:Re: How to greedy? first sort?buct how to do after it? Posted by:MasterLuo at 2008-07-13 18:04:59 先把二位的转化为一维,对数据按W递增排序,按H递减排序,即把二维转化成一维的情形了,因为只有后面的才能套住前面的。。。。
然后从第一个开始往后套,并把已经被套的DOLLS标记,防止第二次被套,如此反复就可以了
大家可以参考一下我的思路:
int flag[20001];
int sum=0;
int cur_x,cur_y;
memset(flag,0,sizeof(flag));
for(i=0;i<m;i++)
{
if(flag[i])
continue;
cur_x=n[i].x,cur_y=n[i].y;
for(j=i+1;j<m;j++)
{
if(cur_x<n[j].x&&cur_y<n[j].y&&!flag[j])
{
cur_x=n[j].x;
cur_y=n[j].y;
flag[j]=1;
}
}
sum++;
}
printf("%d\n",sum);
}
关于二分的算法是这样的:
用数组opt保存当前找到的每个DOLLS堆的最大的DOLL的H值
len表示当前找到DOLLS堆的数目,每次对opt进行二分查找,即找到比当前DOLL的H值小而且最大的,如果没有找到,就把当前的DOLL的H值加入到opt数组中(即二分表中),二分表长度即是DOLLS堆的数目(len值)加1
这样最后len就是所求答案了,先排序,顺序前面已经讲过了,排好就只要对H值操作即可
我的部分代码供参考:
for(i=0;i<n;i++)
{
cur=ns[i].y;
int left=0;
int right=len;
while(left<right)
{
int mid=(left+right)/2;
if(opt[mid]>=cur)
left=mid+1;
else right=mid;
}
if(len==left)
len++;
opt[left]=cur;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator