POJ 1065(贪心)

来源:互联网 发布:ps做gif导出设置优化 编辑:程序博客网 时间:2024/04/29 18:27

题目链接   http://poj.org/problem?id=1065 

题目意思非常简单,有一堆方木需要处理,处理准备时间如下:第一块方木需要时间为1;如果当前处理方木的长宽都大于等于前一块方木,那么准备时间为0。


此题wrong answer了一次,主要是先前的思路是错误的。先前的想法是,按照l进行排序,然后再统计w的逆序个数;同时按照w排序,再统计l逆序的个数。最后,取其中的最小值。后来,发现这种思路是严重有问题的!


其实这个题十分简单,就是将所有的数据分成几个集合,每一个集合都是升序的,然后统计集合最小的个数。

代码如下:


#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;typedef struct{   int l,w,vi;}point;point p[5005];bool cmp1(const point &p1,const point &p2){   if(p1.l==p2.l) return p1.w<p2.w;   return p1.l<p2.l;}void solve(){    int n,i,j,te,sum=0;    scanf("%d",&n);    for(i=0;i<n;i++){       scanf("%d %d",&p[i].l,&p[i].w);       p[i].vi=0;    }    sort(p,p+n,cmp1);    for(i=0;i<n;i++)    {        if(p[i].vi==0)        {            sum++;p[i].vi=1;            te=i;            for(j=te+1;j<n;j++)               if(p[j].vi==0 && p[te].l<=p[j].l) { te=j; p[j].vi=1; }        }    }    printf("%d\n",sum);}int main(){    int t;    scanf("%d",&t);    while(t--)  solve();    return 0;}

原创粉丝点击