题目链接:https://cn.vjudge.net/problem/POJ-2420

题意

给出n个点,找一个点,使得这个点到其余所有点距离之和最小。

思路

一开始就在抖机灵考虑梯度下降,猜测是个凸优化问题,完全在抖机灵。

最后实在是没得其他思路了,看了看题解。

居然是模拟退火,而且写的貌似没有随机这个因素,完全是爬山法好吧?

梯度下降,复杂度O(60000n)

提交过程

WA 偏导方程没给对
AC 其实maxEpoch没必要这么大,只要发现多次best值更新小于1即可退出循环

代码

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const double learningRate=1.4, step=1;
const int maxEpoch=60000, maxn=100+20;
double nx[maxn], ny[maxn];
int n;
struct Point{
double x, y;
Point(double x, double y):x(x), y(y) {}
};
double getDis(int ax, int ay, int bx, int by){
return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
} double criter(Point p){
double dis=0;
for (int i=0; i<n; i++)
dis+=getDis(p.x, p.y, nx[i], ny[i]);
return dis;
} double SGD(void){
double x=0.5e4, y=0.5e4, best;
for (int epoch=0; epoch<=maxEpoch; epoch++){
double base=criter(Point(x, y));
double dx=(criter(Point(x+step, y))-base)/step;
double dy=(criter(Point(x, y+step))-base)/step; x-=dx*learningRate;
y-=dy*learningRate;
if (epoch==0) best=base;
else best=min(best, base); // if ((epoch+1)%1000==0)
// printf("%.3f,%.3f %.3fbase %.3fbest\n", dx, dy, base, best);
}return criter(Point(x, y));
} int main(void){
while (scanf("%d", &n)==1 && n){
for (int i=0; i<n; i++) scanf("%lf%lf", &nx[i], &ny[i]);
printf("%.0f\n", SGD());
} return 0;
}
Time Memory Length Lang Submitted
563ms 400kB 1221 G++ 2018-08-09 04:36:51

最新文章

  1. Net设计模式实例之桥接模式( Bridge Pattern)
  2. 修改/etc/profile文件
  3. Mysql InnoDB行锁实现方式(转)
  4. process vs thread
  5. 阿里云Centos中二级域名绑定二级目录的方法
  6. [转]C/C++中的memset
  7. HDU 5074 Hatsune Miku(DP)
  8. Java的LockSupport.park()实现分析
  9. jdbc数据连接池dbcp要导入的jar包
  10. Struts2之Validator
  11. 全民抵制“辱华”品牌秀,D&amp;G神回复:呵呵~ 那不是我!
  12. Docker操作笔记(三)数据管理
  13. 如何在vs2015中编译并配置tesseract4.0
  14. Spark学习之JavaRdd
  15. [exceltolist] - 一个excel转list的工具
  16. java基础知识-比较运算符
  17. 带你走进二进制-一次APT攻击分析
  18. Maximum Shortest Distance 最大团 二分答案 HDU 3585
  19. nginx如何启用对HTTP2的支持 | nginx如何验证HTTP2是否已启用
  20. oreilly 用户故事地图

热门文章

  1. 在Windows环境下使用短信猫收发短信的简单配置:
  2. 一些BFC
  3. BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)
  4. [luogu2607 ZJOI2008] 骑士 (树形dp)
  5. [读书笔记] Python数据分析 (一) 准备工作
  6. 自动合法打印VitalSource Bookshelf中的电子书
  7. 小学生都能学会的python(函数)
  8. sql where条件子句
  9. webpack实现模块化打包
  10. Vue轮播图插件---Vue-Awesome-Swiper