Codeforces Round #152 (Div. 2)

来源:互联网 发布:东京好玩的地方 知乎 编辑:程序博客网 时间:2024/05/16 05:35

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 500050int 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;}

原创粉丝点击