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