标签:
题意:给出一个圆周,这个圆周上有n个雕塑,现在加入m个雕塑,问最小的移动距离
因为不管怎么移动,可以选择一个作为坐标原点,所以需要挪动的是n-1个
最开始不理解白书上的式子--- 后来搜题解 http://www.cnblogs.com/wuhenqs/p/3203114.html
pos = i*(n + m) /n
是把这个圆周缩成周长为(n + m)的圆,然后除以n代表原来的一份有多少,再乘以份数i,得到它原来的位置
又因为圆的周长是n+m,所以现在的pos一定是整数
所以 距离 = |pos - floor(pos + 0.5)| ,再除以(n+m),缩成周长为1的圆,到最后输出答案的时候乘以10000就可以了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=1000005; 17 18 int main(){ 19 int n,m; 20 while(scanf("%d %d",&n,&m) != EOF){ 21 double pos = 0.0,ans = 0.0; 22 for(int i = 1;i < n;i++){ 23 pos = (double) (i) / n * (n+m); 24 ans += fabs(pos - floor(pos+0.5)) / (n+m); 25 } 26 printf("%.4lf\n",ans * 10000); 27 } 28 return 0; 29 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4622046.html