F.邻家割草

时间限制:3s
描述:
邻居 Alice 家 有一块大草坪, 每个一段时间他都要用割草机修剪草坪; 可以把草坪看成是一个 N * M 的矩阵, 割草时需要 N 台割草机水平方向穿过草地, M 台割草机垂直方向穿过草地。草地并不是完全平整的, 有高有低; 如图所示,高的地方用深色表示, 矮的地方用浅色表示。
割草机工作时需要消耗燃油, 在走过不同的高度的草地时, 会消耗 A 元燃油费; (比如从低的地方走到高的地方, 从高的地方走到低的地方, 在相同高度的地块上运行割草机的燃油消耗可以忽略)。Alice 为了节省燃油费, 准备改造一些地形; 可以给一些地块加入来升高地形,或者把高的地方铲平来降低地形高度,对一个地块进行改造需要花费 B 元。你能帮邻居 Alice 设计一个方案。 让他花费最小吗?

输入
输人的第一行是四个整数 N M A B,分别表示矩阵有 N 行,M 列; 走过不同高度的地块需要多花费 A 元; 调整地块高度需要花费 B 元,
接下来 N 行,每行 M 个字符,‘#’ 代表高的地块, 字符 ‘.’ 代表低的地块
1 <= N, M <= 50
1 <= A, B <= 10^6
输出
输出 Alice 改造地块 + 割草的最小花费

样例输入

54 1000 2000
. . . #
# . . #
. . . #
# # . .
# # # .

样例输出

11000

解题思路
此题的难点在于:
(1)找出权值最大的土地(权值指该点四周不同点的个数)
(2)计算割草机从上到下从左到右工作后,走过不同高度的地块需要的费用。
根据题目可知,若改造地形应当选择权值最大的土地(因为改变权值最大的土地节省的费用最多),再计算改变后所需的费用,与改变前的费用比较,判断是否合算,直到费用变高或找不到权值最大的土地,此时的土地状况花费最少。

具体解法
根据输入的土地情况(#或.)建图(用二维数组储存),再计算各个点的权值,求出权值最大的土地并改变该土地的情况(#变成. .变成#),之后计算改变后所花费用,判断改变后所花费用和改变前所花费用大小以及是否存在权值最大的土地,通过不断改变土地,最终输出最小花费。

代码

#include<iostream>
using namespace std;
#define Max 1000
int n, m;//n行m列
int a, b;//费用class Point
{public:char c;//点的状况 int w;//四周不同点的个数
};
Point p[Max][Max];int getMaxW()//得到权值最大的点,并改变它的状况(权值指四周不同点的个数)
{int max = 0;Point* t = NULL;//因为要改变权值最大的点,所以用指针 for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++){p[i][j].w = 0;if(i - 1 >= 0)//得到所有点的权值p[i][j].w += (p[i - 1][j].c != p[i][j].c);if(i + 1 < n)p[i][j].w += (p[i + 1][j].c != p[i][j].c);if(j - 1 >= 0)p[i][j].w += (p[i][j - 1].c != p[i][j].c);if(j + 1 < m)p[i][j].w += (p[i][j + 1].c != p[i][j].c);  if(p[i][j].w > max)  {max = p[i][j].w;t = &p[i][j];}}}if(t != NULL)//找到权值最大的点,变化状况{if(t->c == '#')t->c = '.';elset->c = '#';return t->w;}//返回权值,未找到时权值为0 return 0;
}int getMoney()//得到该种情况下走不同高度点所需费用
{int sum = 0;for(int i = 0; i < n; i++)//向右的除草机 {int k = 0;while((k + 1) < m){if(p[i][k].c != p[i][++k].c)sum += a;}}for(int j = 0; j < m; j++)//向下的除草机 {int v = 0;while((v + 1) < n){if(p[v][j].c != p[++v][j].c)sum += a;}}return sum;
}int main(void)
{cin >> n >> m >> a >> b;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)cin >> p[i][j].c;int sum = getMoney(), i = 0;int weight = getMaxW();while(weight && (a * weight) > b)//若存在权值最大的点且改变后的花费小于等于改变前 {i++;sum = getMoney() + b * i;//更新花费 weight = getMaxW();//更新权值 }cout << sum;return 0;
}

运行结果

该组数据为一般数据可测试费用变高的情况

该组数据为测试不存在权值最大土地的情况

2019年安徽省程序设计大赛(F.邻家割草)相关推荐

  1. C# 自嗨:2019年安徽省程序设计大赛题目——机器人足球

    原题链接:https://blog.csdn.net/weixin_43581819/article/details/90405178 时间限制:2s 描述: 足球场地长为100,宽为20,对方球门的 ...

  2. 2018年安徽省程序设计大赛题解

    2018年安徽省程序设计大赛参考题解 水平有限错误难免. A: 数7 时间限制:1 s 题目描述: ​ 求整数序列A 中位置L 到R中间一共有多少个7,(每一个位上的7和能被7整除的次数) 输入 第一 ...

  3. csdn邻家割草_如何维护割草机,使其永远持续(几乎)

    csdn邻家割草 The lawnmower is one of those tools that many people don't really think much about except f ...

  4. 2020安徽省程序设计大赛_收集圣物

    思路介绍 典型的BFS问题,权重相等的图 由于BFS找最短路,第一次达到某个点即为从初始点到这个点的最短路,所以当拿到钥匙,遇见有门的情况,直接开!不影响结果,这是干扰选项! 代码展示 import ...

  5. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 F 等式 (唯一分解定理)

    题目描述  给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整数) 输入描述: 在第一行输入一个正整数T. 接下来有T行,每行输入一个正整数n,请求出符合该方程要 ...

  6. 2010年湖南省第六届大学生程序设计大赛 F题 “Biggest Number” CSG - 1051 // UVA 11882 (dfs+bfs+剪枝)

    题目链接 一.题目内容 一个r行c列的矩阵,里面只有1-9的数字和'#',最开始可以随意挑选一个数字然后可以上下左右移动,问所走的路径所含数字最大为多少. 样例解释 input 3 7 ##9784# ...

  7. AOJ - 邻家割草(最小割)

    题目链接:点击查看 题目大意: 题目分析:参考模型:善意的投票 因为每个方格只有两种状态,所以考虑最小割,初始时为 ' . ' 的与源点相连,初始时为 ' # ' 的与汇点相连 每次转换可以视为一次冲 ...

  8. 2020安徽省大学生程序设计大赛题解——F 跳蛙出行

    2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...

  9. 2020安徽省大学生程序设计大赛题解——J 飞奔的战士

    2020安徽省大学生程序设计大赛题解--J 飞奔的战士 J 飞奔的战士 题目 众所周知, T e u t o n i c K n i g h t Teutonic Knight TeutonicKni ...

最新文章

  1. 9. 混合模型和EM(1)
  2. SpiderMonkey
  3. 性能测试四十五:性能测试策略
  4. 【微信小游戏实战】零基础制作《欢乐停车场》二、关卡设计
  5. 文件的删除和文件信息的读取
  6. QT Core | 信号槽03 - 自定义信号与槽
  7. android开发——手机通话功能实现
  8. MQTT服务器的搭建与MQTT客户端的使用
  9. li指令 汇编_汇编语言和汇编软件
  10. macOS Monterey 12.2 (21D49) 正式版 ISO、IPSW、PKG 下载
  11. java Virtual Machine Launcher
  12. C语言【洛谷】P1007 独木桥
  13. RabbitMQ学习
  14. 第四十六章 SQL函数 DAY
  15. Flink基础系列8-Flink on yarn运行wordcount程序
  16. 17.答题卡识别判卷
  17. 将字符串转换为日期,将日期转换成指定格式的字符串
  18. XJOI 循环-分解质因式
  19. 那些年我们玩过的Spark下的Standalone集群模型
  20. openvino模型学习-从模型转化流水线制作

热门文章

  1. 【解决报错问题:selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurr】
  2. PTA 07-图6 旅游规划 (25 分)
  3. elementUI合并单元格
  4. anaconda 创建虚拟环境
  5. 【Mac】anaconda创建虚拟环境+jupyter虚拟环境配置
  6. 十次方中的前端知识点随记
  7. 中等专业学校校园广播系统解决方案,职业中专校园IP网络广播系统建设设计指南,校园IP网络广播在职业院校的应用分析
  8. 试总结计算机整机组装的方法和流程,项目9 组装计算机整机.ppt
  9. Java中获取节假日日期
  10. uni-app 使用uCharts图表插件