题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995

题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出index Qi,求出离数组下标 Qi(从1开始) 最近的 K 个点,从新计算该下标所指示的value值,即等于 K 个 最近点的value值之和 / K,如果有多个K的最近点,那么选择坐标值靠前的那组。

模拟题。首先对将位置(因为输入不一定按顺序从左至右递增排序,样例有骗人的嫌疑)从小到大排序,然后求出每一个点的 K 个最近点,最近是通过xi 离当前 xpos 的距离来判断的,不断试探。如果发现左边的点的xl 比 右边的的点 xr 离 xi的距离近,那么就选左边的点,所以要通过进一步排序比较,Judge()函数中return point[pos].xi - point[l].xi < point[r].xi - point[pos].xi; 就是通过比较两边距离值来决定是选左边的那个点还是右边的那个点。(处理得非常地巧妙)

这个代码是学人家的,自以为看懂,写起来还是反反复复修改了很多次才成功~~~

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; typedef __int64 LL;
const int maxn = 1e5 + ;
double vi[maxn];
vector<int> g[maxn];
int N, M, K; struct node
{
int id, xi;
}point[maxn]; int cmp(const node& a, const node& b)
{
return a.xi < b.xi;
} bool Judge(int pos, int l, int r)
{
if (r > N)
return true;
if (l <= )
return false;
if (point[pos].xi - point[l].xi != point[r].xi - point[pos].xi) // 离两边距离值不同,选择距离值更小的那个点
return point[pos].xi - point[l].xi < point[r].xi - point[pos].xi;
return point[l].id < point[r].id; // 如果离两边的距离值相同,那么选择坐标值小的那个
} void Get_KNN(int pos) // 获得每个点的最近 k 个点是那些
{
int id = point[pos].id;
int l = pos - , r = pos + ;
for (int i = ; i < K; i++)
{
if (Judge(pos, l, r))
g[id].push_back(point[l--].id);
else
g[id].push_back(point[r++].id);
}
} int main()
{
int T;
while (scanf("%d", &T) != EOF)
{
while (T--)
{
scanf("%d%d%d", &N, &M, &K);
for (int i = ; i <= N; i++)
{
scanf("%d%lf", &point[i].xi, &vi[i]);
point[i].id = i;
}
sort(point+, point++N, cmp);
for (int i = ; i <= N; i++)
Get_KNN(i);
int ask;
double ans = ;
for (int i = ; i < M; i++)
{
scanf("%d", &ask);
double sum = ;
for (int j = ; j < g[ask].size(); j++)
sum += vi[g[ask][j]];
vi[ask] = sum / K;
ans += vi[ask];
}
printf("%.6lf\n", ans);
for (int j = ; j <= N; j++)
g[j].clear();
}
}
return ;
}

BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告的更多相关文章

  1. BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 题目意思:给出 X 和 Y,求出 第 K 个 X 和 Y 的最大公约数. 例如8 16,它们的公 ...

  2. BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A ...

  3. BestCoder8 1002 Revenge of Nim(hdu 4994) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4994 题目意思:有 n 个 heap(假设从左至右编号为1-n),每个 heap 上有一些 objec ...

  4. BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 题目意思:找出第二个最长递增子序列,输出长度.就是说,假如序列为 1 1 2,第二长递增子序列是 ...

  5. BestCoder11(Div2) 1003 Boring count (hdu 5056) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5056 题目意思:给出一条只有小写字母组成的序列S,问当中可以组成多少条每个字母出现的次数 <= ...

  6. BestCoder18 1002.Math Problem(hdu 5105) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...

  7. BestCoder17 1002.Select(hdu 5101) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目意思:给出 n 个 classes 和 Dudu 的 IQ(为k),每个classes 都有 ...

  8. BestCoder8 1001.Summary(hdu 4989) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4989 题目意思:给出 n 个数,然后将这些数两两相加,得到 n*(n-1) /2 对和,把重复的和去掉 ...

  9. BestCoder24 1001.Sum Sum Sum(hdu 5150) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5150 题目意思:就是直接求素数. 不过 n = 1,也属于答案范围!!只能说,一失足成千古恨啊---- ...

随机推荐

  1. 手动搭建SpringMVC报错

    猜测这个是由于自己在搭建时缺少包造成的,后来将按照自己之前的项目将包补齐,tomcat就不报错了,看来还是要学习maven 这样就不会缺少包了

  2. leach和leach-c协议仿真

    http://blog.csdn.net/codingkid/article/details/7215216 1.复制leach_test为leach-c_test,修改里面的文件夹和输出文件名.并且 ...

  3. Java_观察者模式(Observable和Observer)

    http://blog.csdn.net/tianjf0514/article/details/7475164/ 一.观察者模式介绍 在Java中通过Observable类和Observer接口实现了 ...

  4. Android Studio使用教程

    http://blog.csdn.net/ryantang03/article/details/8948037 http://blog.csdn.net/ryantang03/article/deta ...

  5. Jquery+Ajax+Json的使用(微信答题实例)

    —————————————————————TP框架下的方法————————————————————————

  6. Spring实战学习笔记之SpEL表达式

            在Spring XML配置文件中装配Bean的属性和构造参数都是静态的,而在运行期才知道装配的值,就可以使用SpEL实现         SpEL表达式的首要目标是通过计算获得某个值. ...

  7. php排序 sort、rsort、asort、arsort、ksort、krsort

    sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort() 函数用于对数组单元从低到高进行排序并保持索引关系. arsort() 函数用于 ...

  8. WPF 窗体拖转时不触发MouseLeftButtonUpEvent

    解决方案:手动添加Handler,因为e.Handled这个属性是用在路由事件中的,当某个控件得到一个RoutedEvent,就会检测Handled是否为true,为true则忽略该事件. //手动注 ...

  9. iOS6新特征:UICollectionView高级使用示例之CircleLayout

    DEMO   下面再看看Demo运行的效果图,通过这样的一个Demo,我们可以看出,使用UICollectionView可以很方便的制作出照片浏览等应用.并且需要开发者写的代码也不多.   程序刚刚启 ...

  10. ios7开发学习笔记-包括c oc 和ios介绍

    请查看我的新浪资料分享 http://iask.sina.com.cn/u/2430843520