Codeforces Round #615 (Div. 3) 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");
}
}
}
反思:
Vain_拾荒者 发布了205 篇原创文章 · 获赞 12 · 访问量 8484 私信 关注写题时候要注意小细节!!!!
写题时候要注意小细节!!!!
写题时候要注意小细节!!!!
标签:Collecting,node,const,int,Codeforces,615,写题,maxn,思路 来源: https://blog.csdn.net/yangzijiangac/article/details/104075507