codeforces865C

Должен Go Fast

 Codeforces - 865C 

Вы пытаетесь установить рекорд на вашей любимой видеоигры. Игра состоит из  N уровней, которые должны быть выполнены последовательно, чтобы пройти игру. Обычно завершения каждого уровня так быстро , как это возможно, но иногда закончить уровень медленнее. В частности, вы совершите  я -й уровень в любом  F I  секунд или  S I  секунды, где  F я  <  S я , и есть  P я  процентный шанс завершить его в  F я секунд. После завершения уровня, вы можете решить, либо продолжить игру и играть на следующий уровень, или сбросить игру и снова начать с первого уровня. Оба решения и действия являются мгновенными.

Ваша цель состоит в том, чтобы завершить все уровни последовательно не более чем в  R  всего секунд. Вы хотите , чтобы свести к минимуму ожидаемого количества времени , играя до достижения этой цели. Если Вы продолжите и сброс оптимально, сколько всего времени вы можете рассчитывать потратить играть?

вход

Первая строка входных данных содержит целые числа  N  и  R  , количество уровней и количество секунд вы хотите , чтобы закончить игру в, соответственно. N  строк следует. Я й такой линии содержит целые числа  Р я ,  S я ,  Р я  (1 ≤  F я  <  S я  ≤ 100, 80 ≤  P я  ≤ 99), быстрое время для уровня  я , медленное время для уровня  я , и вероятность (в процентах) от завершения го уровня  I  с быстрым временем.

Выход

Печать общего ожидаемого срока. Ваш ответ должен быть правильным в абсолютной или относительной погрешности  10  - 9 .

Формально, пусть ваш ответ будет  , и ответ жюри будет  б . Ваш ответ будет считаться правильным, если  .

Примеры

вход
1 8 
2 8 81
Выход
3,14
вход
2 30 
20 30 80
3 9 85
Выход
31,4
вход
4 319 
63 79 89
79 97 91
75 87 88
75 90 83
Выход
+314,159265358

Заметка

В первом примере, вы никогда не нужно сбросить. Там в  81% вероятность завершения уровня в  2 секунды и  19% вероятность необходимости  8 секунд, оба из которых находятся в пределах времени цели. Ожидаемое время составляет  0,81 · 2 + 0,19 · 8 = 3.14.

In the second example, you should reset after the first level if you complete it slowly. On average it will take 0.25 slow attempts before your first fast attempt. Then it doesn't matter whether you complete the second level fast or slow. The expected time is 0.25·30 + 20 + 0.85·3 + 0.15·9 = 31.4.

 

sol:

dp[i][j]表示当前为第i关,已用时j,从当前开始通关的用时期望
tmp表示从头开始通关的用时期望
设当前状态为(i,j):
①如果在挑战第i关前选择重新开始游戏,则通关的期望值tmp
②如果通过第i关用时为a[i],则继续进行游戏并通关的期望值为(dp[i+1][j+a[i]]+a[i])*p[i]
③如果通过第i关用时为b[i],则继续进行游戏并通关的期望值为(dp[i+1][j+b[i]]+b[i])*(1-p[i])

 

/*
dp[i][j]表示当前为第i关,已用时j,从当前开始通关的用时期望
tmp表示从头开始通关的用时期望
设当前状态为(i,j):
①如果在挑战第i关前选择重新开始游戏,则通关的期望值tmp
②如果通过第i关用时为a[i],则继续进行游戏并通关的期望值为(dp[i+1][j+a[i]]+a[i])*p[i]
③如果通过第i关用时为b[i],则继续进行游戏并通关的期望值为(dp[i+1][j+b[i]]+b[i])*(1-p[i])
*/
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
    ll s=0; bool f=0; char ch=' ';
    while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
    while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0) {putchar('-'); x=-x;}
    if(x<10) {putchar(x+'0'); return;}
    write(x/10); putchar((x%10)+'0');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=55,M=5505;
const double eps=1e-8;
int n,m,a[N],b[N],p[N];
double dp[N][M];
inline bool chk(double tmp)
{
    int i,j;
    for(i=n;i>=1;i--)
    {
        for(j=m+1;j<M;j++) dp[i+1][j]=tmp; //重来
        for(j=0;j<=m;j++)
        {
            double t1=(double)(dp[i+1][j+a[i]]+a[i])*p[i]/100;
            double t2=(double)(dp[i+1][j+b[i]]+b[i])*(100-p[i])/100;
            dp[i][j]=min(t1+t2,tmp);
        }
    }
    return dp[1][0]<tmp;
}
int main()
{
    freopen("data.in","r",stdin);
    int i;
    R(n); R(m);
    for(i=1;i<=n;i++)
    {
        R(a[i]); R(b[i]); R(p[i]);
    }
    double l=0.00,r=1e10,mid;
    for(i=1;i<=100;i++)
    {
        mid=(l+r)*0.50;
        if(chk(mid)) r=mid;
        else l=mid;
    }
    printf("%.12lf\n",l);
    return 0;
}
/*
input
4 319
63 79 89
79 97 91
75 87 88
75 90 83
output
314.159265358
*/
View Code

 

рекомендация

отwww.cnblogs.com/gaojunonly1/p/11228332.html