HDU 1006 Tick and Tick 模拟
2015-12-10 22:11
369 查看
题意:就是问24小时中秒针,分针,时针的夹角两两大于d的时刻占总时刻的比重。
思路:模拟。我是求出秒针,分针,时针两两之间的速度,然后每次累加一个根据这个速度可以转180。180^。的区间,然后每次替换掉一个结束时刻最早的区间,直到有一个区间的开始时刻大于24∗60∗60s24*60*60s。
坑点:时间不是连续的,不是1s,1s的走的,而是不停的在走,所以就不能计算出每一秒的相隔角度,再计算。
http://acm.hdu.edu.cn/showproblem.php?pid=1006/********************************************* Problem : HDU 1006 Author : NMfloat InkTime (c) NM . All Rights Reserved . ********************************************/ #include <map> #include <set> #include <queue> #include <cmath> #include <ctime> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define rep(i,a,b) for(int i = a ; i <= b ; i ++) #define rrep(i,a,b) for(int i = b ; i >= a ; i --) #define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) #define cls(a,x) memset(a,x,sizeof(a)) #define eps 1e-8 using namespace std; const int MOD = 1e9+7; const int INF = 0x3f3f3f3f; const int MAXN = 1e5; const int MAXE = 2e5; typedef long long LL; typedef unsigned long long ULL; int T,n,m,k; double degree; void input() { } double max_d(double a1,double a2,double a3) { double max_deg = a1; if(a2 > max_deg) max_deg = a2; if(a3 > max_deg) max_deg = a3; return max_deg; } double min_d(double a1,double a2,double a3) { double min_deg = a1; if(a2 < min_deg) min_deg = a2; if(a3 < min_deg) min_deg = a3; return min_deg; } void solve() { double v12 = 6 - 1.0/10; double v13 = 6 - 1.0/120; double v23 = 1.0/10 - 1.0/120; double base1,base2,base3,t1,t2,t3,t12,t13,t23,base12,base13,base23; t1 = base1 = degree / v12 ; t2 = base2 = degree / v13; t3 = base3 = degree / v23; t12 = 180 / v12; t13 = 180 / v13; t23 = 180 / v23; base12 = t12 - t1 ; base13 = t13 - t2; base23 = t23 - t3; double limit = 60 * 60 * 24; int cnt1 = 1 , cnt2 = 1, cnt3 = 1; double cro = 0; double ans = 0; while(1) { //区间t1-t12 t2-t13 t3-t23 if(t1 > limit || t2 > limit || t3 > limit) break; cro = min_d(t12,t13,t23) - max_d(t1,t2,t3); if(cro < 0) cro = 0; ans += cro; if(t12 <= t13 && t12 <= t23) { if(cnt1 % 2) { t1 = t12 ; t12 += base12 ; } else { t1 += 180 / v12 + base1; t12 = t1 + base12 ; } cnt1 ++; } else if(t13 <= t12 && t13 <= t23) { if(cnt2 % 2) { t2 = t13 ; t13 += base13 ; } else { t2 += 180 / v13 + base2; t13 = t2 + base13 ; } cnt2 ++; } else { if(cnt3 % 2) { t3 = t23; t23 += base23 ; } else { t3 += 180 / v23 + base3; t23 = t3 + base23 ; } cnt3 ++; } } //printf("%d %d %d\n",cnt1,cnt2,cnt3); printf("%.3lf\n",ans/limit*100); } int main(void) { //freopen("a.in","r",stdin); //scanf("%d",&T); //while(T--) { //while(~scanf("%d %d",&n,&m)) { while(scanf("%lf",°ree),degree+1) { input(); solve(); } return 0; }
相关文章推荐
- C/C++ 浮点数比较问题
- IOS吐槽狂人:卡顿和闪退
- Make 命令
- 计算机网络:应用层
- 浏览器-03 WebKit 渲染1
- hdoj The Euler function 2824 (欧拉函数打表)
- 史上最全的SpringMVC学习笔记
- rip-ipv6:
- Java后台使用支付宝进行支付实现---使用阿里提供的对应服务的支付宝接口
- IOS 文件管理 ,文件缓存
- Android中 int 和 String 互相转换的多种方法
- WPF窗口最大化
- Android多媒体应用——短信收发
- bukkit的插件教程
- Oracle中查看无效的对象、约束、触发器和索引(转自Helloblock)
- 数据持久化 之 沙盒机制 (sandBox)
- python基础知识--字符串
- Unity 制作灯罩 双面材质背面不受光照影响的解决方法
- 5北京某高校可用的电话号码有以下几类:校内电话号码由4位数字组成,第一位数字不是0.校外电话又分为本市电话和外地电话两类。拨校外电话需要先拨0,若是本市电话则接着拨8位数字(第一位不是0),若是外地电话则拨3位区码后再拨8位电话号码(第一位不是0)。
- shall 脚本-DHCP安装和配置