Gym100286C Clock
不想打题面,题面戳这里。
被这题吓到了,感觉无从下手。最后还是看着题解和别人的代码加以改编最后写出了的。其实理解之后写出了也就是三四十行的样子了。
首先题目有个很重要的条件——转动某个针只会对周期比他长的钟产生影响,这似乎就给我们开了个口子。
我们假设第\(i\)根针有\(D_{i-1}\)的刻度(第一根针 \(60\) 个刻度),然后我们会惊奇地发现,当第\(i\)根针运行一个周期后,第\(i+1\)根针恰好移动一个刻度。因为假设第\(i\)根针周期为\(T\),第\(i+1\)根针的周期就是\(D_iT\)。然后\(i\)这根指针转了一周,\(i+1\)恰好转了\(\frac{1}{D_i}\)周,也就是一个刻度。于是我们可以用\(cost_i\)记录下第\(i\)根针移动一个刻度所需要最小代价,dp方程很简单
\]
考虑到调针的代价其实只跟时间差的绝对值有关(顺逆时针等价),于是我们可以把问题等价成从0时刻将针调至时间差绝对值这个时刻所需要的最小代价。我们可以看看目标时刻指针所只在的位置,由于可能在两个位置中间,我们可以取下整。然后这个可以用进制转换一样的思想来处理,第\(i\)根指针用\(val_i\)记录。为什么取下整呢?后面你就会慢慢理解。
接下来,就是这道题目最核心的dp部分了。我们用\(f_{i,0}\)表示将第\(i\)根指针转至\(val_i\)位置所需要的最小代价,\(f_{i,1}\)表示将第\(i\)根指针转至\(val_i+1\)位置所需要的最小代价。由于周期长的不能影响周期短的,我们可以从后往前dp。我们如果已经把第\(i\)根针安放在\([val_i,val_i+1)\)这段区间里面,那么移动周期比他短的指针时候也会在这个区间里面。因为\(i-1\)这根针我们最多转动一个周期,所以\(i\)这个针最多移动一个刻度,我们可以在dp方程中保证其合法性。然后根据针可以顺时针转也可以逆时针转,可以得出
f[i][1] = \min(f[i+1][1]+(D[i]-val[i]-1)*cost[i],f[i+1][0]+(val[i]+1)*cost[i])\]
这两个方程,最后答案就是\(f[1][0]\)了。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 55; const double pi = acos(-1.0);
int N,D[maxn],L[maxn],val[maxn]; ll T1,T2,T;
double cost[maxn],f[maxn][2];
int main()
{
freopen("clock.in","r",stdin);
freopen("clock.out","w",stdout);
scanf("%d",&N);
for (int i = 2;i <= N;++i) scanf("%d",D+i);
for (int i = 1;i <= N;++i) scanf("%d",L+i);
D[1] = 60; cost[1] = 2*pi*L[1]/D[1];
for (int i = 2;i <= N;++i) cost[i] = min(cost[i-1]*D[i-1],2*pi*L[i]/D[i]);
cin >> T1 >> T2; T = abs(T1-T2);
for (int i = 1;i <= N&&T;T /= D[i++]) val[i] = T%D[i];
for (int i = N;i;--i)
{
f[i][0] = min(f[i+1][1]+(D[i]-val[i])*cost[i],f[i+1][0]+val[i]*cost[i]);
f[i][1] = min(f[i+1][1]+(D[i]-val[i]-1)*cost[i],f[i+1][0]+(val[i]+1)*cost[i]);
}
printf("%.10lf\n",f[1][0]);
fclose(stdin); fclose(stdout);
return 0;
}
Gym100286C Clock的更多相关文章
- 修改Linux系统日期与时间date clock
先设置日期 date -s 20080103 再设置时间 date -s 18:24:30 为了永久生效,需要将修改的时间写入CMOS. 查看CMOS的时间: #clock -r 将当前系统时间写到C ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
- Cesium应用篇:3控件(1)Clock
创建 跟Clock相关的主要有Animation控件和Timeline控件,通常两者会放在一起使用. 在Cesium中,Viewer默认开启这两个控件,如果你想要不显示控件,可以在Viewer初始化中 ...
- get back to the slower clock rate that allows it to save more power
http://www.howtogeek.com/177790/why-you-cant-use-cpu-clock-speed-to-compare-computer-performance/ Wh ...
- Clock rate
https://en.wikipedia.org/wiki/Clock_rate The clock rate typically refers to the frequency at which a ...
- clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别【转】
转自:http://www.cnblogs.com/krythur/archive/2013/02/25/2932647.html 转自http://blog.sina.com.cn/s/blog_7 ...
- 最少clock
var elClock = document.getElementById("clock");var getTime = function(){ var _ = ['00','01 ...
- 用clock()函数计算多项式的运行时间
百度百科中定义clock():clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(void) ; 简 ...
- 编写Java应用程序。首先,定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时、分、秒,一个构造方法用于对三个成员变量(时、分、秒) 进行初始化,还有一个成员方法show()用于显示时钟对象的时间。其次,再定义 一个主类——TestClass,在主类的main方法中创建多个时钟类的对象,使用这 些对象调用方法show()来显示时钟的时间。
package com.hanqi.test; public class Clock { int hh; int mm; int ss; String time; Clock(int h,int m, ...
随机推荐
- mysql基础,索引
- Nagios 监控Windows服务器(详细篇)
1. 监控内容 windows服务器的内部参数包括以下 a. 内存使用状况 b. CPU负载 c. 磁盘使用状况 d. 服务状态 e. 运行的进程 2. 监控原理 在windows服务器内安装NSCl ...
- Golang反射机制
Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...
- Struts2之基于配置的字段校验
上一篇struts2之输入校验介绍了手动完成输入校验,也即依靠重写validate方法和validateXxx方法,指定请求某个方法时对传入的参数进行校验. 本篇介绍基于配置的字段校验.下面是登录的常 ...
- vue笔记v-bind
把message的信息绑定给title,运行出来的结果是<span title="you loaded this page on +Mon Nov 21 2016 18:28:38 G ...
- css样式 body的font-size 为什么用625%
浏览器的默认高度?一般为16px. 为什么用62.5%作为body的默认样式?16px62.5%=10px.* 那么为什么一般多是 16px *625% = 100px; <响应式Web设计实 ...
- windows下的node.js和npm的安装步骤详解
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- python3 练习题100例 (十七)四位车号问题
#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'Fan Lijun' import math for i in range(1 ...
- IAR 编译时找不到头文件的解决方法
Fatal Error[Pe1696]: cannot open source file "x.h" 那是因为头文件路径没有找对 到报错的.c源文件 选中右键 选择options ...
- Dawson City【道森市】
Dawson City Cities usually have a good reason for being where they are, like a nearby port or river. ...