题目:Graveyard
题意:
差不多可以抽象成这样:有n个黑点等分圆周,m(在题目中)个白点等分圆周,现在可以在圆周上移动这些黑点,求移动的最小距离让黑点全部在白点上。
思路:
可以固定一个黑点在白点上,把其它的黑点进行移动。此时就是把每个黑点移动到和它最近的白点上,这样的和一定是最优的。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
#include <cmath>
using namespace std;
#define maxn 1000
#define len 10000
int n,m;
int main() {
while(~scanf("%d%d",&n,&m)){
m+=n;
double ans=0;
for(int i=1;i<n;i++){
double x=(double)i*m/n;
ans+=fabs(x-(int)(x+0.5));
}
printf("%.4lf\n",ans*len/m);
}
return 0;
}