hdu 1006 Tick and Tick 时钟问题

难度:2

美剧找到所有的符合要求的区间

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
double max3(double a , double b , double c) {
    return (a > b)?(a > c ? a : c) : (b > c ? b : c);
}
double min3(double a , double b , double c) {
    return (a < b)?(a < c ? a : c) : (b < c ? b : c);
}
int main() {
    double ss,mm,hh,sm,mh,sh,t_sm,t_mh,t_sh;
    ss = 6.0 , mm = 0.1 , hh = 0.1/12.0;
    sm = 6.0 - 0.1;
    mh = 0.1 - 0.1/12.0;
    sh = 6.0 - 0.1/12.0;
    t_sm = 360.0 / sm;
    t_mh = 360.0 / mh;
    t_sh = 360.0 / sh;
    int D;
    double m[3] , n[3] , x[3] , y[3];
    while(~scanf("%d" , &D) && D != -1) {
        x[0] = D / sm;
        x[1] = D / mh;
        x[2] = D / sh;
        y[0] = (360.0 - D) / sm;
        y[1] = (360.0 - D) / mh;
        y[2] = (360.0 - D) / sh;
        double st , ed , ans = 0;
        for(m[0]=x[0],n[0]=y[0];m[0]<=43200;m[0]+=t_sm,n[0]+=t_sm) {
            for(m[1]=x[1],n[1]=y[1];m[1]<=43200;m[1]+=t_mh,n[1]+=t_mh) {
                if(m[0] > n[1]) continue;
                if(n[0] < m[1]) break;
                for(m[2]=x[2],n[2]=y[2];m[2]<=43200;m[2]+=t_sh,n[2]+=t_sh) {
                    if(n[2] < m[1] || n[2] < m[0]) continue;
                    if(m[2] > n[0] || m[2] > n[1]) break;
                    st = max3(m[0] , m[1] , m[2]);
                    ed = min3(n[0] , n[1] , n[2]);
                    if(ed > st) ans += ed - st;
                }
            }
        }
        printf("%.3lf\n" , ans/432.0);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值