POJ1609 Tiling Up Blocks

无情的一题!!!哭

读了半小时题,才把题目看懂,发现是LIS后写了二分的那种方法,node[i]向ans[i]赋值的时候len++了两次,样例跑不出来,从机房走出去看见一只小猫,回来就发现了bug

=。=

结果一提交,RE,检查发现n最大10000我开的22222,没开小,百度里面看到有人也用这个方法提交后也是RE。。。自己出了几组数据后发现貌似不能用二分写呢(至少我还没想到该怎么改,看到后知道怎么改的筒子请私信=。=)

下面是RE二分代码

#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 10010
using namespace std;

struct Node
{
    int x,y;
}node[N];
struct Ans
{
    int x,y;
}ans[N];

int len;
int binary_search(int i)
{
    int le,ri,mid;
    le=1;ri=len;
    while(le<=ri)
    {
        mid=(ri+le)/2;
        if(node[i].x<=ans[mid].x&&node[i].y<=ans[mid].y)
               ri=mid;
               else
               le=mid+1;
    }
    return le;
}

int cmp(Node a,Node b)
{
    if(a.x==b.x)
    return a.y<=b.y;
    else
    return a.x<b.x;
}
int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&node[i].x,&node[i].y);
        }
            sort(node+1,node+1+n,cmp);
            ans[1].x=node[1].x; ans[1].y=node[1].y;
            len=1;
         for(int i=2;i<=n;i++)
         {
             if(node[i].x>=ans[len].x&&node[i].y>=ans[len].y)
             {
                 len++;
                 ans[len].x=node[i].x; ans[len].y=node[i].y;
             }
             else
             {
                 int pos=binary_search(i);
                 ans[pos].x=node[i].x;
                 ans[pos].y=node[i].y;
             }
         }
         cout<<"-----------"<<endl;
         for(int i=1;i<=n;i++)
        {
            printf("%d %d\n",node[i].x,node[i].y);
        }
           cout<<"------------"<<endl;
        for(int i=1;i<=len;i++)
        cout<<ans[i].x<<" "<<ans[i].y<<endl;
         //printf("%d\n",len);
    }
        printf("*\n");
    return 0;
}
/*
5
1 1
2 6
3 3
4 2
5 5
5
1 1
2 6
4 4
3 8
5 3
*/
 
 
其实l和m给的范围蛮小的,只有100,换方法喽
<pre name="code" class="cpp">#include<stdio.h>
#include<string>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 22222
using namespace std;
int dp[110][110];
struct Node
{
    int x,y;
}node[N];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        memset(dp,0,sizeof dp);

        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&node[i].x,&node[i].y);
             dp[node[i].x][node[i].y]++;
        }

        for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
        {
            dp[i][j]+=max(dp[i][j-1],dp[i-1][j]);
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(dp[node[i].x][node[i].y]>ans)
            ans=dp[node[i].x][node[i].y];
        }
        printf("%d\n",ans);
    }
    printf("*\n");
    return 0;
}

 
 



你可能感兴趣的:(POJ1609 Tiling Up Blocks)