您的位置:首页 > 其它

UVA 1388 - Graveyard

2015-09-10 00:29 405 查看
题意:n个点在一个圆上,每个点的距离平均分布,再加入M个点,那么最少需要移动多少距离可以让n+m个点平均分布,问最少移动的距离、

思路:模拟,将N个点的位置求出来,再将n+m个点的位置求出来,第一个点都是固定不动的,其他的点只需要按照最短的移动便可、

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110000;
int n,m;
double ans;
struct node{
double x;
int y;
int z;
}msq[maxn];
int cmd(struct node a,struct node b){
return a.x<b.x;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF){
if(n==m){
printf("0.0\n");
continue;
}
ans=0.0;
msq[0].x=0.0;msq[0].y=1;msq[0].z=1;
msq[2*n+m-1].x=0.0;msq[2*n+m-1].y=1;msq[2*n+m-1].z=1;
for(int i=1;i<n;i++){
msq[i].x=(10000.0/(n*1.0))*(i*1.0);
msq[i].y=1;
msq[i].z=0;
}
for(int i=n;i<2*n+m-1;i++){
msq[i].x=(10000/((m+n)*1.0))*((i-n+1)*1.0);
msq[i].y=2;
msq[i].z=0;
}
sort(msq,msq+n+m+n-1,cmd);
for(int i=1;i<m+n+n-1;i++){
if(msq[i].y==1&&msq[i].x==msq[i-1].x){
msq[i-1].y=1;
continue;
}
else if(msq[i].y==1&&msq[i].x==msq[i+1].x){
msq[i+1].y=1;
continue;
}
else if(msq[i].y==1){
if(msq[i-1].y==2&&msq[i+1].y==2){
if(msq[i-1].z==0&&msq[i-1].z==0){
if(msq[i].x-msq[i-1].x>msq[i+1].x-msq[i].x){
ans+=msq[i+1].x-msq[i].x;
msq[i+1].z=1;
}
else{
ans+=msq[i].x-msq[i-1].x;
msq[i].z=1;
}
}
else if(msq[i-1].z==0){
msq[i-1].z=1;
ans+=msq[i].x-msq[i-1].x;
}
else if(msq[i+1].z==0){
msq[i+1].z=1;
ans+=msq[i+1].x-msq[i].x;
}
}
else if(msq[i-1].y==2&&msq[i-1].z==0){
ans+=msq[i].x-msq[i-1].x;
msq[i-1].z=1;
}
else if(msq[i+1].y==2&&msq[i-1].z==0){
ans+=msq[i+1].x-msq[i].x;
msq[i+1].z=1;
}
}
}
if(10000%n==0&&10000%(n+m)==0)
printf("%.1lf\n",ans);
else
printf("%.4lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: