P3162 [CQOI2012]组装
退火大法好
我并不会正解于是只好打退火了……其他没啥好讲……只要对每一种颜色开一个vector,存一下所有这个颜色的位置,判定的时候可以去所有的颜色里二分找到前缀和后缀,把和当前点距离小的加入答案
然后就没有然后了……
//minamoto
#include<bits/stdc++.h>
#define IT vector<int>::iterator
#define R register
#define double long double
#define RD T*(rand()*2-RAND_MAX)
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(R int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e4+5;const double D=0.97,eps=1e-14;
vector<int>pos[N];double ans=1e10,pp,pr,T,res,best,pq,hp;int n,m,x,c,mn=1e5+5,mx=-1e5+5;
IT it;
double calc(R double x){
double r=0,p;
fp(i,1,n){
p=1e12;
it=lower_bound(pos[i].begin(),pos[i].end(),x);
if(it!=pos[i].end())p=min(p,(*it)-x);
if(it!=pos[i].begin())p=min(p,x-*(it-1));
r+=p*p;
}return r;
}
int main(){
srand(time(0));
// freopen("testdata.in","r",stdin);
n=read(),m=read();fp(i,1,m)x=read(),c=read(),pos[c].push_back(x),mn=min(mn,x),mx=max(mx,x);
pr=(1.0*mn+mx)/2,best=calc(pr);
while(clock()<CLOCKS_PER_SEC*0.5){
hp=pp=pr,ans=best;
for(T=100000;T>eps;T*=D){
pq=pp+RD,res=calc(pq);
if(best>res)best=res,pr=pq;
if(ans>res||exp((ans-res)/T)>(double)rand()/RAND_MAX)
ans=res,pp=pq;
}if(pr==hp)break;
}printf("%.4Lf\n",pr);
}
P3162 [CQOI2012]组装的更多相关文章
- luogu P3162 [CQOI2012]组装
传送门 mdzz,为什么这题有个贪心的标签啊qwq 首先考虑每一种车间,对于每相邻两个车间,在中点左边那么左边那个会贡献答案,在右边就右边那个更优 所以总共会有m-1个这样的分界中点,然后最多有m+1 ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- [CQOI2012]组装 贪心
[CQOI2012]组装 贪心好题. LG传送门 首先有一个必须要能推的式子:设第\(i\)种零件选的生产车间位置为\(x _ i\),组装车间位置为\(x\), 则总的花费为 \[f(x) = \s ...
- 【BZOJ2666】[cqoi2012]组装 贪心
[BZOJ2666][cqoi2012]组装 Description 数轴上有m个生产车间可以生产零件.一共有n种零件,编号为1~n.第i个车间的坐标为xi,生产第pi种零件(1<=pi< ...
- BZOJ 2666: [cqoi2012]组装
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...
- Luogu3162 CQOI2012 组装 贪心
传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...
- 【题解】P3162CQOI2012组装
[题解][CQOI2012]组装 考虑化为代数的形式,序列\(\left[a_i \right]\)表示选取的\(i\)种类仓库的坐标. \(ans=\Sigma(a_i-x)^2,(*)\),展开: ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 建造者模式组装mybatis参数Example()
参考:github, https://github.com/liuxiaochen0625/MyBatis-Spring-Boot-master.git 从controller组装tk.mybat ...
随机推荐
- JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
- python字符串连接方法效率比较
方法1:直接通过加号(+)操作符连接 1 website = 'python' + 'tab' + '.com' 方法2:join方法 1 2 listStr = ['python', 'tab', ...
- Linux 思维导图
1.Linux学习路径: 2.Linux桌面介绍: 3.FHS(文件系统目录标准): 以上三张图,都是在学习实验楼上的课程--Linux 基础入门,教程里面看到的. 4.Linux需要特别注意的目录: ...
- Office EXCEL 如何保留一位小数,并且单击这个单元格的时候没有一大串小数
左侧有一列数据,即便我设置单元格格式,把小数位数设为1,看上去的确四舍五入,保留一位小数了,但是实际上我鼠标双击任意单元格,还是原来的数值,这样的数据如果是要发给别人的,肯定不好 如果进行选择性粘 ...
- [wxWidgets]_[0基础]_[不常见但有用的类wxCmdLineParser]
场景: 1. 有时候须要构造命令行字符串传递給函数调用,比方CreateProcess,假设參数是动态的,那么就得使用类似std::vector<string>加入单个參数,之后拼接为一个 ...
- C语言最小生成树prim算法(USACO3.1)
/* ID: hk945801 LANG: C++ TASK: agrinet */ #include<iostream> #include<cstdio> using nam ...
- Android反复闹钟(每天)的实现
MainActivity例如以下: package cc.cc; import java.util.Calendar; import java.util.Locale; import android. ...
- JSONObjectWithData方法里options參数选择解释
NSJSONReadingMutableContainers Specifies that arrays and dictionaries are created as mutable object ...
- Ubuntu16.04 下python2 | python3
在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...
- STL_算法_最小值和最大值(min_element、max_element)
C++ Primer 学习中... 简单记录下我的学习过程 (代码为主) min_element.max_element 找最小.最大值. 非常easy没什么大作用 #include<iost ...