A. Hotelier
题意:一个长度为
- 使序列最左边为
的位置变为 ; - 使序列最右边为
的位置变为 ; - 指定一个位置,使其变为
。
求操作后的序列。
输入:第一行一个整数,
输出:操作后的序列。
解析:根据题意,模拟即可。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[10];
char s[101010];
int main()
{
scanf("%d",&n);
scanf("%s",s);
for(int p=0;p<n;p++)
{
if(s[p]=='L')
{
for(int i=0;i<=9;i++)
if(a[i]==0)
{
a[i]=1;
break;
}
}
else if(s[p]=='R')
{
for(int i=9;i>=0;i--)
if(a[i]==0)
{
a[i]=1;
break;
}
}
else
a[s[p]-'0']=0;
}
for(int i=0;i<=9;i++)
printf("%d",a[i]);
return 0;
}
B. Block Adventure
题意:给定一个长度为
- 从当前列取出
块,放进自己包里; - 从包里取出
块,放在当前列上,高度增加 。 - 如果
且 ,移动至下一行, 是开始给定的一个常数,这是唯一向后移动的途径。
前两种操作,你依然待在第
回答你是否可以从第
输入:第一行一个数
输出:是否可以到达,
解析:贪心,分两种情况,如果
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,k,t;
int h[110];
int main()
{
scanf("%d",&t);
while(t--)
{
int flag=0;
memset(h,0,sizeof(h));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
for(int i=1;i<n;i++)
{
if(h[i+1]<=k)
m+=h[i];
else
{
if(h[i]>h[i+1]-k)
m+=(h[i]-h[i+1]+k);
else if(h[i]<h[i+1]-k)
{
int p=h[i+1]-k;
if(h[i]+m<p)
{
flag=1;
break;
}
else
m-=(p-h[i]);
}
}
}
if(flag==1)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
C. Round Corridor
题意:一个圆形,外围分为内外两层,内层有

内层从
你有
输入:第一行三个数,
输出:
解析:很明显,内层和外层可以相通,对于一个位置
设
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,q;
long long sx,sy,ex,ey;
long long gcd(long long a,long long b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&q);
long long num=gcd(n,m);
long long num1=n/num,num2=m/num;
for(int i=1;i<=q;i++)
{
scanf("%lld%lld%lld%lld",&sx,&sy,&ex,&ey);
if(sx==1)
sy=(sy-1)/num1;
if(ex==1)
ey=(ey-1)/num1;
if(sx==2)
sy=(sy-1)/num2;
if(ex==2)
ey=(ey-1)/num2;
if(sy==ey)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}