LA3708

来源:互联网 发布:iphone与mac airplay 编辑:程序博客网 时间:2024/05/01 14:58

Problem: Graveyard
Description: 有N个墓地,均匀排布到一个周长为10000的圆周上。现在要加M个墓地到这个圆周上,并且均匀分布,那么问你,这N个圆周至少要移动多少距离才能满足均匀分布这个条件。
Solution: 这个问题我看到的第一感觉就是枚举。我们要计算出N+M个墓地在圆周上均匀分布的位置POS[i]。然后依次枚举N个墓地在圆周上均匀分布的位置到POS[I],POS[I+1]哪个位置的距离更近。这个I就是距离I最近的POS的位置。这个题目有个坑:Sample Input中如果没有小数是保留了1位小数。而如果你这么做了就会WA。因为Input中告诉你要保留4位小数。
Code(C++):

#include <stdio.h>#include <math.h>const double L=10000;int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        double sig_pre=L/n;        double sig_now=L/(n+m);        double ans=0;        for(int i=1;i<n;i++){            double pos=sig_pre*i;            double pre_pos=sig_now*(int)(pos/sig_now);            double pre_pos2=pre_pos+sig_now;            ans+=pos-pre_pos>pre_pos2-pos? pre_pos2-pos:pos-pre_pos;        }        printf("%.4f\n",ans);    }    return 0;}

而刘汝佳大神的解法和我的很相似,但是他代码和想法真的是精辟。他是把这个周长缩小的10000倍。然后利用四舍五入的方式去选择到哪个点。而且他还提到了会不会两个点同时移动到同一个点去。答案是肯定不会的。我们可以这么考虑。设N个墓地时的位置为POS1N+M个墓地时的位置为POS2。那么我们枚举POS1会不会POS11POS12都移动到POS22。这个自己画个图就很清楚了。POS11只有距离POS22的距离少于DPOS21POS22/2的时候才会移动到POS22,那么这个时候POS12距离POS22的距离就会大于DPOS21POS22/2,因为DPOS11POS12大于DPOS21POS22。这个时候POS12只能移动到POS23了。

画图

Code(C++):

#include <stdio.h>#include <math.h>const double L=10000;int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        double ans=0;        for(double i=1;i<n;i+=1){            double pos=i/n*(n+m);            ans+=fabs(pos-(int)(pos+0.5))/(n+m);        }        printf("%.4f\n",ans*L);    }    return 0;}
0 0
原创粉丝点击