A 题:略。
B题:当n等于1或2时,没有满足条件的数,当n等于3时,210是满足条件 的最小数,此后每个对应n的满足条件的最小数都是210的倍数,于是只要把210作为除数,模拟除法。
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,t;
while(scanf("%d",&n)!=EOF)
{
t=1;
if(n<3)
printf("-1\n");
else if(n==3)
printf("210\n");
else
{
for(i=1;i<n;i++)
{
t%=210;
t*=10;
}
t%=210;
if(t)
t=210-t;
printf("1");
for(i=0;i<n-4;i++)
printf("0");
if(t>=100)
printf("%d\n",t);
else if(t>=10)
printf("0%d\n",t);
else
printf("00%d",t);
}
}
return 0;
}
C题:纯几何题,因为只要求出满足条件的任意Xw,于是找一个临界值就可以了,假设从y2擦过,w为球的轨迹与y轴的夹角,则只要判断r/sinw+r+y1与y2的大小就行了。
#include<cstdio>
#include<cmath>
int main()
{
double y1,y2,yw,xb,yb,r,xw,y;
scanf("%lf%lf%lf%lf%lf%lf",&y1,&y2,&yw,&xb,&yb,&r);
xw=xb/(yw-r-yb)/(1/(yw-r-yb)+1/(yw-y1-2*r));
y=r/sin(atan((xb-xw)/(yw-r-yb)));
y1+=y+r;
if(y1>=y2)
printf("-1\n");
else
printf("%.8f\n",xw);
return 0;
}
D题:模拟题,具体看代码。
#include<cstdio>
#include<cstring>
#define MAXN 500050
int n,t;
char str[MAXN];
int judge(int val)
{
int i,num=val,ans;
int end=0;//表示必须走到的最远的地方
int last; // 走到house时出现糖果小于0的情况
for(i=0;i<n;i++)
{
if(str[i]=='H')
{
end=i;
num--;
}
else if(str[i]=='S')
{
num++;
if(num==0)
end=i;
}
}
if(num<0)
return false;
ans=0;
last=-1;
num=val;
for(i=0;i<=end;i++)
{
ans++;
if(str[i]=='H')
{
num--;
if(num==-1)
{
if(ans+((end-i)<<1)<=t) //当前点到最远点的距离的两倍(来回)加上之前花费的时间
return true;
last=i;
}
}
else if(str[i]=='S')
{
num++;
if(num==0)
{
ans+=(i-last)<<1; //之前出现糖果小于0的点,必须返回去
last=-1;
}
}
}
return ans<=t;
}
int main()
{
int l,r;
while(scanf("%d%d%s",&n,&t,str)!=EOF)
{
l=0,r=n;
while(l<r) //二分枚举满足条件的最少糖果
{
int mid=(l+r)>>1;
if(judge(mid))
r=mid;
else
l=mid+1;
}
printf("%d\n",judge(r)?r:-1);
}
return 0;
}