练习赛,很基础的计算几何题,考察的是定比分点,哎,当时是思路是清晰的,不过没自信没去敲,队友给过了,今天自己来敲了下,算是过了,比较容易出错的可能是分段的那里,要把分好段后取点时的情况考虑清楚:(该题意思为由多个线段首尾相连组成一条路径,让你把它等分成m+1段)
1.当所分的等分段在一条线段上挺好办,直接按定比分点算
2.当所分的等分段在两条线段上怎么办
以上两点可得出需要记录下每次分段的起始位置,以便利用,还有当前段长度的更新。
总归来说,是的好好自己敲点代码,开学也不能懈怠,加油!
#include<cstdio>
const int maxn = 1000;
const double eps = 1e-8;
struct Point{
double x;
double y;
}p[maxn];
double line[maxn];
int dblcmp(double x){ return x<-eps?-1:x>eps; }
double get_dis(Point p1,Point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main(){
int n,m,kase=1;
while(scanf("%d %d",&n,&m)!=EOF){
p[0].x=0, p[0].y=0;
for(int i=1;i<=n;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
double sum=0;
for(int i=0;i<n;i++){
double dis=get_dis(p[i],p[i+1]);
line[i]=dis;
sum+=dis;
}
double ave=sum/(m+1);
int t=0,pos=0;
double sx=p[0].x,sy=p[0].y;
double x,y,r;
double reg=ave;
printf("Route %d\n",kase++);
while(t<m){
if(dblcmp(reg-line[pos])<=0){
if(dblcmp(reg-line[pos])==0)r=0;
else r=reg/(line[pos]-reg);
x=(sx+r*p[pos+1].x)/(1+r);
y=(sy+r*p[pos+1].y)/(1+r);
sx=x; sy=y;
printf("CP%d: (%.3lf, %.3lf)\n",t+1,x,y);
line[pos]-=reg;
reg=ave;
t++;
}
if(dblcmp(reg-line[pos])>0){
reg-=line[pos];
pos++;
sx=p[pos].x;
sy=p[pos].y;
}
}
}
return 0;
}