买彩票

来源:互联网 发布:大雨还在下网络歌手 编辑:程序博客网 时间:2024/04/29 14:07
【问题描述】
电视里面正放着“抽百万大奖,赢幸福生活”的宣传广告,bird 看后也想去试试手气,
当然,作为经济学院的高材生,他可不屑只是单纯地去碰运气。经过他的一番分析,发现,
商家在彩票里面做了手脚,使得每个抽奖点的中奖概率不是完全一样的,而且随着时间的变
化而变化,不过这种变化是有规律的。对于第1 个抽奖点,最开始的中奖概率是百万分之
Pi,以后每抽一张彩票后都要重新排队,花费的时间是T 分钟,每抽一次减少的概率为Di。
由于可怜的bird 还有一大堆的作业没做,他只能抽出H 个小时去买彩票。由于抽奖地
点都在一路公共汽车的线路上,所以怕麻烦的bird 决定按车站顺序抽奖,当然,bird 可以从
任意一站开始抽奖,对于经过的抽奖点可以买彩票,也可以不买。假设从第i 个抽奖点到第
i+l 个抽奖点需要坐Ci 分钟的汽车。
Bird 希望能在有限的H 个小时内获得最好的运气——抽奖的概率和最大。
【输入】
第一行为一个整数n,表示抽奖点的个数,l≤n≤200
第二行是两个整数H 和T,1≤H≤10,1T≤60。
接下来的n 行,每行3 个整数,分别是Pi,Di,Ci(Cn=0)。l≤Pi≤10000,Di≤Pi,l≤C1
≤600。
【输出】
文件仅有一行,为一个整数,即抽奖概率和的最大值。
【输入输出样例】
2
1 20
200 100 10

300 200 0


500
【样例说明】
首先,bird 从l 号开始抽奖,花费20 分钟,得到概率200,然后坐车到2 号,花费

10 分钟,再花20 分钟得到概率300,概率和是500,花费50 分钟。

枚举起点和终点,再模拟。

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <queue>using namespace std;#define maxn 500int H,T;int n;int p[maxn],tmp[maxn],d[maxn],c[maxn],use[maxn];int suan(int s,int t){    int mp,mv,i,times,flag;    times=0;    mv=0;    for(int i=s;i<t;i++)    {        tmp[i]=p[i];        times+=d[i];    }    tmp[t]=p[t];    if(times>=H)    {        return 0;    }    times=(H-times)/T;    while(times)    {        int ma=0;        for(int i=s;i<=t;i++)        {            if(tmp[i]>ma)            {                ma=tmp[i];                flag=i;            }        }        if(ma==0)        {            break;        }        mv+=ma;        tmp[flag]-=c[flag];        times--;    }    return mv;}int main(){    freopen("ticket.in","r",stdin);    freopen("ticket.out","w",stdout);    scanf("%d",&n);    scanf("%d%d",&H,&T);    for(int i=1;i<=n;i++)    {        scanf("%d%d%d",&p[i],&c[i],&d[i]);    }    H=H*60;    int ans=0;    for(int i=1;i<=n;i++)    {        for(int j=i;j<=n;j++)        {            ans=max(ans,suan(i,j));        }    }    printf("%d\n",ans);    return 0;}/*21 20200 100 10300 200 0*/

0 0
原创粉丝点击