UVA 1388 - Graveyard

来源:互联网 发布:windows update在哪里 编辑:程序博客网 时间:2024/05/21 00:00

题意: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;}


0 0
原创粉丝点击