Codeforces Round #615 (Div. 3) B Collecting Packages

题目链接:B Collecting Packages

一道很简单的题,但是我在开数组上出了问题,一直runtime error 4 test 我这里提供两种思路,第一种思路也是我最开始想到的,但是因为数据范围没搞明白,这种思路在比赛上没有过,第二种思路也是最普遍的思路,因为在比赛上第一种思路没有过,我就切了思路,用第二种思路过了

题解1:

一理解题意,我就想到这个思路,开始敲,但是数据范围我没仔细考虑,就懵逼了。首先我们利用动态规划的思路,求出取得最优的个数,然后让最优个数和n个箱子比较,如果相等,说明可以取完n个箱子,不相等就不可以,然后对位置进行操作即可

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
const int man=1e6+5;
int mp[maxn][maxn];
int dp[maxn][maxn];
int cnt;
struct node
{
    int x,y;
} road[man];
bool cmp(node a,node b)
{
    if(a.y==b.y)
    return a.x<b.x;
    return a.y<b.y;
}
char s[man];
void opt(int x,int y,int x1,int y1)
{
    int lenx=x1-x,leny=y1-y;

    for(int i=0; i<lenx; i++)
    {
        s[cnt]='R';
        cnt++;
    }
    for(int i=0; i<leny; i++)
    {
        s[cnt]='U';
        cnt++;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        memset(mp,0,sizeof(mp));
        memset(s,0,sizeof(s));
        cnt=0;
        int n,mx=-1,my=-1;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&road[i].x,&road[i].y);
            mp[road[i].x][road[i].y]=1;
            mx=max(mx,road[i].x);
            my=max(my,road[i].y);
        }
        sort(road+1,road+n+1,cmp);
        for(int i=1; i<=n; i++)
        {
            opt(road[i-1].x,road[i-1].y,road[i].x,road[i].y);
        }
        for(int i=0; i<=mx; i++)
        {
            for(int j=0; j<=my; j++)
            {
                if(mp[i][j])
                {
                    if(i==0&&j!=0)
                        dp[i][j]=dp[i][j-1]+1;
                    else if(i!=0&&j==0)
                        dp[i][j]=dp[i-1][j]+1;
                    else if(i==0&&j==0)
                    {
                        dp[i][j]+=1;
                    }
                    else
                    {
                        dp[i][j]=max(dp[i-1][j],dp[i][j-1])+1;
                    }
                }
                else
                {
                    if(i==0&&j!=0)
                        dp[i][j]=dp[i][j-1];
                    else if(i!=0&&j==0)
                        dp[i][j]=dp[i-1][j];
                    else if(i==0&&j==0)
                    {
                        dp[i][j]=0;
                    }
                    else
                    {
                        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                    }
                }
            }
        }
        if(dp[mx][my]==n)
        {
            printf("YES\n");
            printf("%s\n",s);
        }
        else
        {
            printf("NO\n");
        }

    }

}

题解二:

因为只能向上或者向右走,那么我们只需要判断,从(0,0)x轴顺序,连接每一个坐标是不是满足一条不下降的折线,如果是,那么就输出YES,否则输出NO,这个我们只需要排一个序即可

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int cnt;
struct node
{
    int x,y;
} road[maxn];
bool cmp(node a,node b)
{
    if(a.y==b.y)
    return a.x<b.x;
    return a.y<b.y;
}
char s[maxn];
void opt(int x,int y,int x1,int y1)
{
    int lenx=x1-x,leny=y1-y;
 
    for(int i=0; i<lenx; i++)
    {
        s[cnt]='R';
        cnt++;
    }
    for(int i=0; i<leny; i++)
    {
        s[cnt]='U';
        cnt++;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(s,0,sizeof(s));
        cnt=0;
        int n,fla=0;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&road[i].x,&road[i].y);
        }
        sort(road+1,road+n+1,cmp);
        for(int i=1; i<=n; i++)
        {
            opt(road[i-1].x,road[i-1].y,road[i].x,road[i].y);
        }
        for(int i=1;i<n;i++)
        {
            if(road[i].x>road[i+1].x)
            {
                fla=1;
                break;
            }
        }
        if(!fla)
        {
            printf("YES\n");
            printf("%s\n",s);
        }
        else
        {
            printf("NO\n");
        }
    }
 
}

反思:

写题时候要注意小细节!!!!
写题时候要注意小细节!!!!
写题时候要注意小细节!!!!

发布了205 篇原创文章 · 获赞 12 · 访问量 8483

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/104075507