- 思路和解析,参见第一版题解:
铲雪车题解 洛谷链接
这里是只是做了输入优化,优化如下:
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;
}