HDU 4995 Revenge of kNN

来源:互联网 发布:淘宝点卡进货渠道 psn 编辑:程序博客网 时间:2024/05/21 14:52

题意:t组样例,有n个点,给出每个点的位置和价值,给出m个点的下标进行查询,将这m个点的价值变为离它最近的k个点的价值的平均值,如果有两个点到它的距离相等,那么要下标小的那个,最后输出n个点的总价值

解题思路:模拟.用一个结构体存储n个点的位置、价值和下标,将这n个点按照位置排序,用id数组记录这n个点排序后的位置,举个例子:p[0].x=2、p[0].v=1、p[0].id=0,p[1].x=1、p[1].v=4、p[1].id=1,那么排序后就是p[0].x=1、p[0].v=4、p[0].id=1,p[1].x=2、p[1].v=1、p[1].id=0,那么id[p[0].id]=0,也就是说id[1]=0,刚开始下标是1,排序后下标是0,同理id[p[1].id]=id[0]=1,刚开始下标是0,排序后下标是1,因为给出的m个下标是排序前的下标,所以要用id数组对应排序后的位置。浮点数输入用%lf,输出用%f

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <cstdio>#include <cmath>using namespace std;struct P{    int x;    double v;    int id;}p[100005];bool cmp(P p1,P p2){    return p1.x<p2.x;}int id[100005];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m,k;        scanf("%d%d%d",&n,&m,&k);        for(int i=0;i<n;i++)        {            scanf("%d%lf",&p[i].x,&p[i].v);            p[i].id=i;        }        sort(p,p+n,cmp);        for(int i=0;i<n;i++)        {            id[p[i].id]=i;        }        double ans=0;        while(m--)        {            double sum=0;            int q;            scanf("%d",&q);            q-=1;            int y=id[q];            int l=y-1,r=y+1;            for(int i=0;i<k;i++)            {                if(l<0)                {                    sum+=p[r].v;                    r++;                }                else if(r>=n)                {                    sum+=p[l].v;                    l--;                }                else                {                    if(p[y].x-p[l].x==p[r].x-p[y].x)                    {                        if(p[l].id>p[r].id)                        {                            sum+=p[r].v;                            r++;                        }                        else                        {                            sum+=p[l].v;                            l--;                        }                    }                    else if(p[y].x-p[l].x>p[r].x-p[y].x)                    {                        sum+=p[r].v;                        r++;                    }                    else                    {                        sum+=p[l].v;                        l--;                    }                }            }            sum/=k;            p[y].v=sum;            ans+=sum;        }        printf("%.6f\n",ans);    }    return 0;}


原创粉丝点击