B. 秒针旋转 (deque)

该问题是一个关于算法的编程挑战,描述了一个拥有不带电池的钟表的人(HYX)如何通过手动转动秒针来显示多个重要时刻。给定当前时间和一系列目标时间,目标是找出秒针需要转动的最小总角度,以便至少能显示每个目标时间一次。程序处理了时钟的12小时制,并考虑了秒针的双向转动。解决方案包括排序时刻、消除重复,并寻找最小路径覆盖整个时间范围。
摘要由CSDN通过智能技术生成

Description
HYX 有一个没电的钟表,当前钟表指向了某一个时间,也即当前时针、分针、秒针指向了某个方向。
由于 HYX 有一些很重要的时刻,他希望通过自己手动地不停转动表的秒针,在钟表上复现所有这些时间 (不需要依次复地)。HYX 可以随意地顺时针转动秒针,也可以随意地逆时针转动秒针,分针和时针都会随看秒针按规则转动。HYX需要知道秒针至少转动多少角度就能使得每个时刻至少都可以被访问一次。
需要注意的是,钟表上的 1 种时针分针秒针的组合,可以代表 2 个不同的时间。
Input Data
第一行有一个整数 n n n ,代表有多少个时刻要访问。
第二行有三个整数 h , m , s h, m, s h,m,s ,分别代表当前时刻的时分秒。
最后 n n n 行中每行有三个整数 h i , m i , s i h_i, m_i, s_i hi,mi,si ,代表每个要访问的时刻的时分秒。
1 ≤ n ≤ 86 , 400 0 ≤ h , h i < 24 0 ≤ m , m i , s , s i < 60 \begin{aligned} & 1 \leq n \leq 86,400 \\ & 0 \leq h, h_i<24 \\ & 0 \leq m, m_i, s, s_i<60 \end{aligned} 1n86,4000h,hi<240m,mi,s,si<60
Output Data
在单独的行中输出一个数,代表秒钟转的角度,答案保留两位小数。

Tips:注意时钟表上只有12个小时,不是24个小时,所以要模上43200.

vector<int> v;
signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int n;
    cin >> n;
    int h, m, s;
    cin >> h >> m >> s;
    int init = h % 12 * 3600 + m * 60 + s;
    v.push_back(init);
    int a, b, c;
    for (int i = 1; i <= n; i++) {
        cin >> a >> b >> c;
        int d = a % 12 * 3600 + b * 60 + c;
        v.push_back(d);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    deque<int> dq;
    for (int i : v) {
        dq.push_back(i);
    }
    //cout << "\n";
    while (dq.front() != init) {
        dq.push_back(dq.front() + 43200);
        dq.pop_front();
    }
    int ans = 0x3f3f3f3f;
    int nn = dq.size();
    while (nn--) {
        if (ans > 2 * (init - dq.front()) + dq.back() - init) {
            ans = 2 * (init - dq.front()) + dq.back() - init;
        }
        dq.push_front(dq.back() - 43200);
        dq.pop_back();
    }
    dq.push_back(dq.front() + 43200);
    dq.pop_front();
   // cout << "\n";
    nn = dq.size();
    while (nn--) {
        if (ans > 2 * (dq.back() - init) + init - dq.front()) {
            ans = 2 * (dq.back() - init) + init - dq.front();
        }
        dq.push_back(dq.front() + 43200);
        dq.pop_front();
    }
    cout << fixed << setprecision(2) << (double)ans * 6.0 << "\n";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值