POJ 1065 Wooden Sticks (排序)

来源:互联网 发布:英剧推荐知乎 编辑:程序博客网 时间:2024/06/05 02:59

题意:把树拿去加工,当下一个要加工的树的l,w都不比前一个小的时候,不花费设置时间。问加工这些树,总共要多少设置时间。

我猜的方法是把l排序,找w的不减序列有几个。但是把n==5000看成了50000,鄙视自己吧。到discuss看了之后,发现这种贪心是可以证明的:http://poj.org/showmessage?message_id=156611 好吧,我学的东西太少了。


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <stack>#include <map>#include <string>#define LL long long#define DB double#define SF scanf#define PF printf#define N 5009#define bug cout<<"bug"<<endl;using namespace std;struct nod{    int l,w;    void get(){SF("%d%d",&l,&w);}    bool operator<(const nod t)const    {        return l<t.l||(l==t.l&&w<t.w);    }} re[N];int v[N];int n;int solve(){    memset(v,0,sizeof(v));    int ret=0;    for(int i=0;i<n;i++)    if(v[i]==0)    {        v[i] = 1;        ret++;        int k = re[i].w;        for(int j=i+1;j<n;j++)        if(v[j]==0)        {            if(re[j].w>=k)            {                k = re[j].w;                v[j] = 1;            }        }    }    return ret;}int main(){    #ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);    #endif    int cas;    SF("%d",&cas);    while(cas--)    {        SF("%d",&n);        for(int i=0;i<n;i++) re[i].get();        sort(re,re+n);        PF("%d\n",solve());    }    return 0;}