codeforces 11e

时间:2019-01-19
本文章向大家介绍codeforces 11e,主要包括codeforces 11e使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

神仙题

题意:

杰克现在成了一名士兵。不幸的是,他在演习中遇到了麻烦。他没有按照先迈出左脚再不断交换迈脚的顺序前进,而是不断地重复一系列的步骤序列,有时他会做出错误的步骤或者停一会儿。例如,如果杰克使用序列“右,左,休息”,当中士喊道:“左!右!左!右!左!右!”杰克先用右脚迈出了一步,然后用左脚迈出了一步,然后他感到很迷惑,停了一会儿,然后又一次按照他自己的顺序——用右脚开始,然后用左脚,接着让中士恼怒的是——他又停下来喘口气,又不正确地用右脚开始…这样子行军,杰克会在只有三分之一的时间迈出正确的步伐。

当警官说服他应该改掉这个毛病的时候,杰克决定修改他重复的步骤。然而,为了不太累,他决定他唯一要做的就是在原始序列中的任何位置添加任意数量的中断(中断对应于一步的停顿)。当然,如果这些步骤之间没有停顿,杰克就不能连续的迈出同一只脚。需要注意的是,他目前使用的步骤有可能是不正确的。

帮助士兵杰克!给出他开始时不断重复的步骤,计算出在他计划中增加一些休息时间后他能正确行进的时间占行军时间的最大百分比。

输入输出格式

输入格式:

输入的第一行包含一个只包含字符“L”、“r”和“x”的序列,其中“L”对应的是左脚的一步,"R"代表的是右脚的一步,"X"代表一次休息.

输出格式:

输出杰克能正确行进的最大时间百分比,保留到小数点后六位数。

说明 在第二个例子中,如果我们在lxxrxr序列中增加两次停顿,杰克将这样行军:lxxrxrlxxrxrl…而不是lrlrlrlrlrlrl…这样他在一半的情况下会走出正确的步伐。如果我们不加任何休息,这个顺序就不正确了——杰克不能连续两次地迈右脚

#include <bits/stdc++.h>
using namespace std;

typedef long double ld;
string s, t;

ld calc(string s){
    int p = 0, q = 0, o = 0, f = 0;
    char w;
    for (int i = 0; i < s. length(); i ++){
        w = q & 1 ? 'R':'L';
        if (s[i] == 'X') 
			q ++;
        else if (s[i] == w) {
        	p ++;
        	q ++;
        	f = 0;
		}
        else {
        	p ++;
        	q += 2;
        	o += f;
        	f = !f;
		}
    }
    if (q & 1){
    	q ++;
    	o += f;
	}
    if (p * 2 > q){
    	p -= o;
    	q -= o * 2;
	}
    return (ld)p / q;
}

int main(){
    cin >> t;
    s = "";
    for (int i = 0; i < t. length(); i ++){
        if (i && t[i] == t[i - 1] && t[i] != 'X') 
			s += 'X';
        s += t[i];
    }
    ld ans;
    if (t[0] == t[t. size() - 1] && t[0] != 'X')
        ans = max(calc('X' + s), calc(s + 'X'));
    else ans = calc(s);
    ans = floor(ans * 1e8) / 1e8;
    printf("%.6lf\n", (double)ans * 1e2);
    return 0;
}