关闭

poj 1042 && uva 757 && la 5422

76人阅读 评论(0) 收藏 举报
分类:

题目概述

有N个湖排成一行,你有H小时钓鱼,每个湖在第一个5分钟内可钓到f条鱼,此后每钓5分钟则下次钓鱼量在上一次基础上减少d条,这个湖到下一个湖需要走t个5分钟,问最多可钓多少鱼,在每个湖钓多久
所有行动必须以5分钟为单位

时限

2000ms/6000ms

输入

第一行整数N,第二行整数H,第三行N个整数f,第四行N个整数d,第五行N-1个整数t,因为第一个湖的t固定为0,输入到EOF为止

限制

1<=H<=16;2<=N<=25;1<=t<=192;0<=f;0<=d;

输出

每组数据输出在两行,第一行N个数,为在该湖钓鱼时长,用逗号和空格分开,第二行字符串
Number of fish expected: #
其中#为所求最大钓鱼数,两组输出之间有一空行

样例输入

2
1
10 1
2 5
2
4
4
10 15 20 17
0 3 4 3
1 2 3
4
4
10 15 50 30
0 3 4 3
1 2 3
0

样例输出

45, 5
Number of fish expected: 31

240, 0, 0, 0
Number of fish expected: 480

115, 10, 50, 35
Number of fish expected: 724

讨论

贪心,如果没有到每个湖移动的时间,那么就是纯贪心,每次从钓鱼量最大的湖钓5分钟鱼,直到时间用尽,如果所有鱼都钓光则从第一个湖用掉剩余时间,即便加上移动的时间也不难考虑,枚举到的最后一个湖,事先将移动用时从总时间中扣除,之后便相当于在第一个到最后一个湖之间瞬间移动,纯贪心,最后比较取出最大的一个即可
实现层面上,利用优先队列处理每次取最大值,每个湖需要有一个编号,才能知道在哪个湖花掉了这5分钟,同时也便于在鱼钓光后用掉剩余时间

题解状态

176K,204MS,C++,1354B

题解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 30
#define memset0(a) memset(a,0,sizeof(a))
struct It//湖的结构
{
    int n, f, d, t;//编号 初始鱼 减少鱼 移动用时
    bool operator<(const It &b)const
    {
        return f != b.f ? f < b.f : n > b.n;
    }
} its[MAXN];
int N, H, mostused[MAXN];//湖数 时间数 最大钓鱼量时每个湖用时数
bool f;//控制空行输出
void fun()
{
    for (int p = 0; p < N; p++) {
        scanf("%d", &its[p].f);//input
        its[p].n = p;
    }
    for (int p = 0; p < N; p++)
        scanf("%d", &its[p].d);//input
    for (int p = 1; p < N; p++) {
        int a;
        scanf("%d", &a);//input
        its[p].t = its[p - 1].t + a;//得到的是从第一个湖到这个湖总计移动用时
    }
    int most = -INF;//最大钓鱼量
    for (int p = 0; p < N; p++) {//枚举去的最远的湖
        int used[MAXN], h = H - its[p].t, sum = 0;//初始化每个湖用时 扣掉移动时间 初始化钓鱼量
        priority_queue<It>pq;
        memset0(used);//毕竟不是全局变量 可能原来有东西
        for (int i = 0; i <= p; i++)
            pq.push(its[i]);
        while (h-- > 0) {
            It a = pq.top();
            pq.pop();
            sum += a.f;//钓了5分钟
            a.f = a.f > a.d ? a.f - a.d : 0;//鱼变少了 当然不能是负的
            used[a.n] += 5;//在这个湖花了5分钟
            pq.push(a);
        }
        if (sum > most) {
            memcpy(mostused, used, sizeof (used));//这样写比较简单
            most = sum;
        }
    }
    if (f)
        printf("\n");//output
    for (int p = 0; p < N; p++) {
        if (!p)
            printf("%d", mostused[p]);//output
        else
            printf(", %d", mostused[p]);//output
    }
    printf("\nNumber of fish expected: %d\n", most);//output
}
int main(void)
{
    //freopen("nb_cin.txt", "r", stdin);
    //freopen("nb_cout.txt", "w", stdout);

    while (~scanf("%d%d", &N, &H) && N) {//input
        H *= 12;//一小时有12个5分钟
        fun();
        f = 1;
        memset0(mostused);
    }
}

EOF

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22648次
    • 积分:2199
    • 等级:
    • 排名:第17232名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:8条
    最新评论