题目链接 : https://vjudge.net/problem/HDU-4995

题目大意  :   读入n个点的坐标与该点所拥有的值val,进行m次查询,对于每一次查询,读入该点的坐标,计算离该点最近的k个点的值(距离相同的索引小的优先),进行求和求平均,

然后更新改点的值,最后输出更新的值的和。

题目分析  :   一个比较不错的模拟的题目,可以对坐标值和 索引进行hash来优化计算时间。

其他进行模拟即可,注意读入的值并不是有序的,需要先进行排序。

代码实现 :

 #include <iostream>
 #include <cstring>
 #include <queue>
 #include <algorithm>
 #include <cstdio>
 using namespace std;
 int m,n,k;
 struct node
 {
     double point;
     double val;
     int id;
 };
 bool comp(const node &a,const node& b)
 {
     return a.point<b.point;
 }
 +];
 node nodes[+];
 void init()
 {
     cin>>n>>m>>k;
     ;i<n;i++)
     {
         double a;
         double b;
         scanf("%lf%lf",&a,&b);
         nodes[i].point=a;
         nodes[i].val=b;
         nodes[i].id = i;
     }
     sort(nodes,nodes+n,comp);
     ;i<n;i++)
     {
         hashs[nodes[i].id+]=i;
     }
 }
 double solve()
 {
     ;
     ;i<m;i++)
     {
         int t;
         scanf("%d",&t);
      //   cout<<t<<endl;
         int mid=hashs[t];
         ,r=mid+;
         int K=k;
         ;
         while(K--)
         {
             &&r<n)
             {
                 double d1=nodes[l].point;
                 double d2=nodes[r].point;
                 double t1=nodes[mid].point-d1;
                 double t2=d2-nodes[mid].point;
                // cout<<t1<<" "<<t2<<" "<<"*"<<endl;
                 if(t1<t2)
                 {
                     sum+=nodes[l].val;
                    // cout<<nodes[l].val<<" "<<l<<endl;
                     l--;
                 }
                 else if(t1>t2)
                 {
                     sum+=nodes[r].val;
                //     cout<<nodes[r].val<<" "<<r<<endl;
                     r++;
                 }else if(t1==t2)
                 {
                     if(nodes[l].id<nodes[r].id)
                     {
                         sum+=nodes[l].val;
                         l--;
                     }
                     else
                     {
                         sum+=nodes[r].val;
                         r++;
                     }
                 }
             }
             )
             {
                 sum+=nodes[l].val;
               //  cout<<nodes[l].val<<" "<<l<<endl;
                 l--;
             }else if(r<n)
             {
                 sum+=nodes[r].val;
              //   cout<<nodes[r].val<<" "<<r<<endl;
                 r++;
             }
         }
       //  cout<<sum<<" *"<<endl;
         sum=sum/k;
         //cout<<sum<<endl;
         SUM+=sum;
         nodes[mid].val=sum;
     }
     return SUM;
 }
 int main()
 {
     int T;
     cin>>T;
     while(T--)
     {
        init();
        double sum=solve();
        printf("%.6lf\n",sum);
     }
     ;
 }

HDU - 4995 - Revenge of kNN的更多相关文章

  1. hdu 4995(离散化下标+模拟)

    Revenge of kNN Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...

  3. HDU 5019 Revenge of GCD(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 Problem Description In mathematics, the greatest ...

  4. HDU - 4994 Revenge of Nim (取石子游戏)

    Problem Description Nim is a mathematical game of strategy in which two players take turns removing ...

  5. hdu 4995 离线处理+模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4995 给定一维坐标下的n个点,以及每个点的权值,有m次查询,每次将查询的x点上的权值修改为离x最近的k个点权值的 ...

  6. HDU 4996 Revenge of LIS(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4996 题意:求1到n的全排列中,有多少个排列的最长上升子列长度为K? 思路:对于当前的最长上升子列,我 ...

  7. hdu 4099 Revenge of Fibonacci 大数+压位+trie

    最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...

  8. hdu 4099 Revenge of Fibonacci 字典树+大数

    将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...

  9. hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法

    Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...

随机推荐

  1. 透过源码看看Redis中如何计算QPS

    通常我们采集Redis的性能数据时,或者想要知道Redis当前的性能如何时,需要知道这个实例的QPS数据,那么这个QPS数据是如何计算的呢?我们都有哪些办法或者这个QPS ? QPS顾名思义就是每秒执 ...

  2. 学习总结------Servlet的简单理解

    1.什么是Servlet Servlet是一个Java编写的程序,在服务器端运行的(如tomcat) Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览 ...

  3. Linux(UBUNTU) 下安装Eclipse

    到目前为止,Eclipse 的官方最新版本为 Eclipse Kepler (4.3.2),我们可以使用如下步骤在 Ubuntu 14.04 或其它 Ubuntu 版本中进行快速安装. 1.安装Ope ...

  4. eclipse 和 jdk的位数不同

    如果eclipse 和 jdk的位数不同,如一个64Bit一个32位,不需要修改环境变量,只需要在eclipse根目录的eclipse.ini文件中第一行加入:-vmD:\Program Files\ ...

  5. easyui框架--基础篇(一)-->数据表格datagrid(php与mysql交互)

      前  言  php  easyui框架--本篇学习主要是 easyui中的datagrid(数据表格)框架. 本篇学习主要通过讲解一段代码加GIF图片学习datagrid(数据表格)中的一些常用属 ...

  6. 【PHP】制作日历

    本期本博主将讲述两种利用PHP制作日历的方法,由于PHP日期函数的便捷性,使得我们制作日历这一过程变得相当简单 问题描述: 1.取到当前日期,并着色显示:2.根据当前日期,判断本月有多少天,一号是周几 ...

  7. NewsDaoImpl

    package com.pb.news.dao.impl; import java.sql.CallableStatement;import java.sql.Connection;import ja ...

  8. hdu2410(水)

    题意 如果两个数字除了带问号的位以外都相同,我们称这两个数可以相互匹配 给你两个数,其中第一个数字里有一些问号,问有多少个大于第二个数的数字可以和第一个数字匹配 一开始懒得读题,到网上搜题意,结果居然 ...

  9. Jenkins-FQA

    1.svn url不能设置成文件路径,而应该是"文件夹"路径,也就是说必须是目录. 示例: Checking out https://svn.gw.com.cn:10000/svn ...

  10. Css绘制形状

    前言:终于我的大一生活结束了,迎来了愉快的暑假,大家都开始了各自的忙碌.一直忙着一些项目的事情,终于决定今天要更新一篇博客了,对上一阶段的学习做简单的总结. 这次我主要总结一下用Css绘制各种形状的技 ...