SP1268 CNEASY - CN Tower (Easy) 题解

· · 题解

SP1268

解法说明

输入对应建筑关于 CN 塔的方向。

餐厅每 72 分钟旋转一周,可以算出旋转 1 度需要 12 秒。

对记录地标的相对方向的数组排序后算出所有相邻地标之间的最大角度差就能使克里斯蒂呆的时间最少。

输入输出并不是本题的难点,最大的难点是如何计算相邻的地标之间的最大角度差,因为最大角度差所在的两个角度可能跨越了 0 度,那么就需要在计算最后一个地标与第一个地标的角度差时使用对应的操作。

根据高中课本对任意角的定义,我们可以将第一个地标的度数加上 360 度,则这两个角的终边重合,此时可以直接计算两角之间的角度差。

解决了这个问题之后,我们只需要用一个 maxn 变量去记录最大角度差就好了,那么克里斯蒂所呆的角度总和就是 (360-maxn) 度,此时就可以直接计算时间总和了,可以使用 ceil 函数进行取整。

代码实现

#include<bits/stdc++.h>
using namespace std;
struct station
{
    double direction;
    string name;
}db[10005];
int cmp(station a,station b)
{
    if(a.direction>b.direction)
    {
        return 0;
    }
    return 1;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int num;
        cin>>num;
        double maxn=0,minn=361;
        for(int j=0;j<num;j++)
        {
            cin>>db[j].name>>db[j].direction;
        }
        sort(db,db+num,cmp);
        for(int j=0;j<num;j++)
        {
            maxn=max(maxn,abs(db[j].direction-(j+1==num?db[0].direction+360:db[j+1].direction)));
        }
        cout<<ceil((360.000-maxn)*12)<<endl;
    }
    return 0;
}

感谢您的阅读,希望对您有所帮助!