P1796 汤姆斯的天堂梦+P1806 跑步+P8742 [蓝桥杯 2021 省 AB] 砝码称重+P1959 遗址+P8794 [蓝桥杯 2022 国 A] 环境治理

本文介绍了几个基于动态规划的编程竞赛题目,包括寻找最低费用的航线、计算跑步圈数的方案、砝码称重问题以及环境治理中的道路改善策略。每个问题都解析了状态转移方程并提供了相应的代码实现。

P1796 汤姆斯的天堂梦

题目描述

汤姆斯生活在一个等级为 00 的星球上。那里的环境极其恶劣,每天 1212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NN 的星球上天堂般的生活。

有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。

汤姆斯预先知道了从 00 等级星球去 NN 等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。

输入格式

第一行一个正整数 NN(N \le 100N≤100),接下来的数据可分为 NN 个段落,每段的第一行一个整数 K_iKi(K_i \le 100Ki≤100),表示等级为 ii 的星球有 K_iKi 个。

接下来的 K_iKi 行中第 jj 行依次表示与等级为 ii,编号为 jj 的星球相连的等级为 i - 1i−1 的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过 10001000)。

每行以 00 结束,每行的航线数 \le 100≤100。

输出格式

输出所需(或所得)费用。正数表示支出,负数表示收益。

输入输出样例

输入 #1复制

3

2

1 15 0

1 5 0

3

1 -5 2 10 0

1 3 0

2 40 0

2

1 1 2 5 3 -5 0

2 -19 3 -20 0

输出 #1复制

-1

说明/提示

对于 100 \%100% 的数据,1 \le N \le 1001≤N≤100,1 \le K_i \le 1001≤Ki≤100。

样例解释:

这道题没看图直接看题目看了好久才弄明白数据的含义(太菜,人麻了),先翻译一下输入数据含义
数据分为3个段落
等级为1的星球有2个
与等级为1,编号为1的星球相连的等级为0的星球的编号和航班需要的费用分别为1,15
与等级为1,编号为2的星球相连的等级为0的星球的编号和航班需要的费用分别为1,5
等级为2的星球有3个
与等级为2,编号为1的星球相连的等级为1的星球的编号和航班需要的费用分别为1,-5
与等级为2,编号为1的星球相连的等级为1的星球的编号和航班需要的费用分别为2,10
与等级为2,编号为2的星球相连的等级为1的星球的编号和航班需要的费用分别为1,3
与等级为2,编号为3的星球相连的等级为1的星球的编号和航班需要的费用分别为2,40
等级为3的星球有2个
与等级为3,编号为1的星球相连的等级为2的星球的编号和航班需要的费用分别为1,1
与等级为3,编号为1的星球相连的等级为2的星球的编号和航班需要的费用分别为2,5
与等级为3,编号为1的星球相连的等级为2的星球的编号和航班需要的费用分别为3,5
与等级为3,编号为2的星球相连的等级为2的星球的编号和航班需要的费用分别为2,-19
与等级为3,编号为2的星球相连的等级为2的星球的编号和航班需要的费用分别为3,-20
看到提示的图可以用动态规划来求解,找到状态转移方程:f[i][j] = min(f[i][j], f[i - 1][num] + w)
i表示等级,j是编号,取第i-1级编号为num的星球到第i级编号为j的星球费用的最小值,f[i][j]表示i-1级星球到i级编号为j的星球的费用
#include<bits/stdc++.h>
using namespace std;
int f[103][103],ans,n,INF=0x3f3f3f3f;
int main()
{
    cin >> n;
    int k,num,w;
    for (int i = 1; i <= n; i++) {//等级
         cin >> k;
         for (int j = 1; j <= k; j++)//编号
         {
             f[i][j] = INF;
             cin >> num;
             while (num != 0)//结束条件
             {
                 cin >> w;
                 f[i][j] = min(f[i][j], f[i - 1][num] + w);
                 cin >> num;
             }
        }
    }
    ans = INF;
    for (int i = 1; i <= k; i++)//k此时的值是最后一级星球个数
        ans = min(ans, f[n][i]);//取倒数第二级星球到最后一级星球费用的最小值
    cout << ans;
    return 0;
}

P1806 跑步

题目描述

路人甲准备跑 nn 圈来锻炼自己的身体,他准备分多次(\gt1>1)跑完,每次都跑正整数圈,然后休息下再继续跑。

为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多。

可以假设他刚开始跑了 00 圈,那么请问他可以有多少种跑完这 nn 圈的方案?

输入格式

一行一个整数,代表 nn

输出格式

一个整数表示跑完这 nn 圈的方案数。

输入输出样例

输入 #1复制

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值