洛谷 AT_ddcc2019_final_a レース (Race) の 题解

这道题比较好理解,按照题意模拟即可。

由于此题没有人做,更没有人交翻译和题解,我就把机翻放在云剪贴板里了,若有问题,可以联系修改。

首先要明确本题要用的变量,变量 \(sum\) 是用来存放最终的结果,字符串 \(s\) 是用来存放地图的,变量 \(len\) 用来存放 \(s\) 的长度,变量 \(cnt\) 是用来存放连续冰块个数,变量 \(mx\) 是用来最大连续冰方块个数。

这道题是让我们把一个雪方块变成冰方块,使得走过这段路的速度最快。由题目公式可知,连续在一起的冰方块数越多,走过这些冰方块的速度就越快,所以我们只需要求一下最大连续冰方块个数,也就是求 \(mx\) 的值,之后把 \(sum\),这时候 \(sum\) 还在存雪方块变冰方块的操作之前的值,这时候我们只需要把 \(sum\) 的值减去 \(1\),代表着删除一个雪方块,之后再加上 \(\frac{1}{mx + 2}\) 就可以得出最终结果了。

还有些细节没有说,上面说的都是将雪方块变冰方块的操作之后的事情,那么之前的时候,\(sum\) 的值怎么求?很简单,这只需要遍历一下字符串 \(s\),之后如果是冰方块,就将 \(sum\) 加上 \(\frac{1}{cnt + 2}\),由于连着的冰方块数,也就是 \(cnt\),又多了一个,这时就可以将 \(cnt\) 自增,并求最大连续冰方块个数。但如果是雪方块,那就说明冰方块就不连续了,把 \(cnt\) 设为 \(0\) 并将 \(sum\) 自增即可。

但是,这道题比较坑,你的 \(mx\) 变量不得设为负数,因为会出现没有冰方块的情况,所以在处理将雪方块变冰方块的操作的时候,\(mx\) 为负数是会出现大差错的。再就是这道题保留小数的时候不能用 fixed << setprecision(15),对于第二个样例来说是会强制保留后面的所有小数的,但是在第二个样例的输出中,小数点后面仅有一位,所以要抛弃 fixed

代码如下。

#include <iostream>
#include <iomanip>
using namespace std;
int len, cnt = 0, mx = 0;
double sum = 0;
string s;
int main(){
    cin >> len >> s;
    for(int i = 0; i < len; i++){
        if(s[i] == '>'){
            sum += (1.0 / (cnt + 2));
            cnt++;
            mx = max(cnt, mx);
        }
        else{
            cnt = 0;
            sum++;
        }
    }
    sum--;
    // cout << sum << endl;
    // cout << (1.0 / (mx + 2)) << endl;
    sum += (1.0 / (mx + 2));
    cout << setprecision(15) << sum << endl;
    return 0;
}

记录

posted @ 2023-09-13 11:17  NFGase  阅读(18)  评论(0)    收藏  举报