【CCPC-Wannafly Winter Camp Day4 (Div1) J】跑跑跑路(爬山)
大致题意: 共进行两轮游戏,每轮每人有一个标签,标签相同的人必须到同一个点集合。求所有人总路程的最小值。
爬山算法
这道题貌似有三种做法:模拟退火、高斯消元以及爬山算法。
相比之下,自然是爬山算法最简单了。
实现方式
设第一轮编号为\(i\)的节点要到点\(s1_i\)集合,第二轮编号为\(i\)的节点要到点\(s2_i\)集合。
则总答案应为:
\]
单独看其中与\(s1_{f1_i}.x\)有关的式子,我们可以发现,要想使这个式子值最小,则\(s1_{f1_i}.x\)与\(a_i.x\)和\(s2_{f2_i}.x\)的差值应越小越好。
但同一个\(s1_{f1_i}.x\)可能会受到多个\(a_i.x\)和\(s2_{f2_i}.x\)影响,所以我们需要使用爬山算法来对其慢慢修正。
具体方式就是每次将\(s1_{f1_i}.x\)减去\(\alpha*(s1_{f1_i}.x-a_i.x)-\alpha*(s1_{f1_i}.x-s2_{f2_i}.x)\)。
其中\(\alpha\)为一个较小的数,可以设为\(10^{-3}\)。
而\(s1_{f1_i}.y,s2_{f2_i}.x,s2_{f2_i}.y\)的修正同理。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 500
#define DB double
using namespace std;
int n,f1[N+5],f2[N+5];
struct Point
{
DB x,y;I Point(Con DB& a=0,Con DB& b=0):x(a),y(b){}
I friend Point operator - (Con Point& x,Con Point& y) {return Point(x.x-y.x,x.y-y.y);}
I friend Point operator * (Con DB& A,Con Point& x) {return Point(A*x.x,A*x.y);}
}a[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int f;char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0,f=1;W(!D) f=c^'-'?1:-1;W(x=tn(x)+(c&15),D);x*=f;}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
class ClimbingSolver//爬山算法
{
private:
#define Dis2(A,B) (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)//计算题目中所要求的两点间距离的平方
Point s1[N+5],s2[N+5],s1_[N+5],s2_[N+5];
public:
I void Climb()
{
RI i,T=50000;Reg DB A=1e-3;W(T--)
{
for(i=1;i<=n;++i)
{
s1_[f1[i]]=s1_[f1[i]]-A*(s1[f1[i]]-a[i])-A*(s1[f1[i]]-s2[f2[i]]),//修正s1
s2_[f2[i]]=s2_[f2[i]]-A*(s2[f2[i]]-s1[f1[i]]);//修正s2
}for(i=1;i<=n;++i) s1[i]=s1_[i],s2[i]=s2_[i];//复制一遍
}
}
I DB GetAns()//求解
{
Reg DB res=0;for(RI i=1;i<=n;++i) res+=Dis2(a[i],s1[f1[i]])+Dis2(s1[f1[i]],s2[f2[i]]);//统计答案
return res;//返回答案
}
}C;
int main()
{
RI i,x,y;for(F.read(n),i=1;i<=n;++i) F.read(x,y),a[i]=Point(x,y);
for(i=1;i<=n;++i) F.read(f1[i]);for(i=1;i<=n;++i) F.read(f2[i]);//读入
return C.Climb(),printf("%.10lf",C.GetAns()),0;//求解并输出答案
}
【CCPC-Wannafly Winter Camp Day4 (Div1) J】跑跑跑路(爬山)的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- CCPC-Wannafly Winter Camp Day4 Div1 - 置置置换 - [DP]
题目链接:https://zhixincode.com/contest/18/problem/G?problem_id=265 题目描述 wls有一个整数 $n$,他想请你算一下有多少 $1...n$ ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)
点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) H】命命命运(概率DP)
点此看题面 大致题意: 有\(6\)个人玩大富翁,共有\(n\)块地,进行\(500\)轮,已知每个人掷骰子掷出\(1\sim6\)的概率.当某人到达一块未被占领的地时,他可以占领它.求最后每个人占有 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- Wannafly Winter Camp Day5 Div1 E题 Fast Kronecker Transform 转化为NTT或FFT
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 原题目描述在最下面. 对给定的式子算解. ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- CCPC-Wannafly Winter Camp Day4 Div1 - 咆咆咆哮 - [三分+贪心]
题目链接:https://zhixincode.com/contest/18/problem/I?problem_id=267 题目描述 输入描述 输出描述 一行一个整数表示答案. 样例输入 1 32 ...
随机推荐
- python搭配selenium,htmltestrunner实现自动化测试 —— (测试思路和基础步骤)
1. 测试思路: 编写测试单例 编写测试套件,集合测试单例 集中测试测试套件 生成测试报告 补充,发送测试结果到E-mail 2. 示例 编写测试单例 编写测试套件 测试脚本程序 生成报告 发送邮件 ...
- 2013 New available ICOM A2 Diagnostic & Programming For BMW ICOM A2+B+C
AUTONUMEN.COM offer best price New ICOM A2 Diagnostic & Programming For BMW ICOM A2+B+C. bmw ico ...
- Hive学习(一)
https://www.cnblogs.com/qingyunzong/p/8707885.html http://www.360doc.com/content/16/1006/23/15257968 ...
- sublime text2 for mac 实现json格式化
问题描述: 网上拿下来的一大段json格式的字符串,放到sublime上格式化成json的标准格式 数据截图如下: 解决问题: 网络上搜了一下,大部分都是说要装pretty json插件 先来看看自己 ...
- maya安装不了
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- [转] javascript另类方法高效实现htmlencode()与htmldecode()函数
本文转自:http://blog.csdn.net/cuixiping/article/details/7846806 最常见的做法是采用正则表达式替换的方法,将特殊字符如 < > &am ...
- zepto.js常用操作
zepto.js是移动端的jquery,但是并没有提供所有与jquery类似的api.Zepto设计的目的是有一个5-10k的通用库.下载并快速执行.有一个熟悉通用的API,所以你能把你主要的精力放到 ...
- Emacs学习笔记1
Emacs笔记-Emacs基本的文本操作 使用命令时要在minibuffer缓冲区中 关于文件 注意 在对单词的操作中C开头的控制范围要比M开头的控制范围要下 对于文件的撤销操作, 不要使用C-x, ...
- HDU 5442——Favorite Donut——————【最大表示法+kmp | 后缀数组】
Favorite Donut Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- ICSharpCode.SharpZipLi 压缩、解压文件 附源码
http://www.icsharpcode.net/opensource/sharpziplib/ 有SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, ...