铲雪车(snow) UVA10203 Snow Clearing 题解 优化版

- 思路和解析,参见第一版题解:
铲雪车题解 洛谷链接

铲雪车 题解 第一版


这里是只是做了输入优化,优化如下:

1、直接使用scanf函数输入,避免了字符转数字。

2、免去了空格数量检测,直接在数字输入时检测下一个字符代替。

主功能函数不变。

- 优化后代码如下:

/*
    优化读入
    因为可以U型掉头,所以沿着出发的路径相反的路,
    一定可以回到出发点。不需要空车前进 。 

    AC代码 
*/
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 500
double ans = 0; //ans:铲雪距离
bool first = true;
//主功能
void resolve()
{
    //双车道,距离乘以2
    ans *= 2;
    ans /= 1000; //单位变成千米

    double time = 0; //单位是小时
    time = ans / 20;
    long long hour = floor(time);
    long long minute = ((time - hour) * 60 + 0.5);
    //四舍五入后够60分钟,小时加1,分钟清零
    if (minute == 60)
    {
        minute = 0;
        hour++;
    }
    if (first)
    {
        //第一组结果输出
        printf("%lld:%02lld\n", hour, minute);
        first = false;
    }
    else
    {
        //先输出一个空白行
        printf("\n%lld:%02lld\n", hour, minute);
    }
}
int main()
{
    // freopen("10203.in", "r", stdin);
    // freopen("10203.out", "w", stdout);
    int t, cnt;
    long long x1, y1, x2, y2;
    char ch;
    bool onegroup = true; //第一组数据
    scanf("%d", &t);
    while (t--)
    {
        
        // 读入一组数据
        while (true)
        {
            // 先读入两个数,如果不能成功读入两个数字,说明到达行尾,直接退出。此时t=0,外层也会退出。结束读入。
            if (scanf("%lld%lld", &x1, &y1) != 2)
                break;
            // 如果后面是空格,一行四个数字,再读入后面两个数
            ch = getchar();
            if (ch == ' ')
            {
                scanf("%lld%lld", &x2, &y2);
                // 累加
                ans += sqrt(pow((x1 - x2), 2.0) + pow((y1 - y2), 2.0));
            }
            else if (ch == '\n') // 两个数字后面是回车,这是起始坐标的位置。
            // 第一组数据的第一行的回车,继续读入
                if (onegroup)
                {
                    onegroup = false;
                    continue;
                }
                else
                {
                    // 非第一行的回车,先处理前面一组数据,再继续读入本组数据
                    resolve();
                    ans = 0;
                    // break;
                }
        }
    }
    //处理最后一组数据输出
    resolve();
    return 0;
}




 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值