A公司的烦恼(贪心)

题目描述:

A公司的计算机管理系统受到千年虫病毒的攻击,因此A公司丢失了向MS公司做年终回报的数据。

A公司目前掌握的数据是MS公司每次公布的公司亏盈报表,而MS公司公布亏盈的方式与众不同,它么次都是将连续5个月的亏盈总和做一次性公布,因此A公司不知道每个月具体的亏盈状况。已知的情况是所有的盈利月的盈利固定为 s ,而亏损月的亏损固定为 d 。

写一个程序,确定MS公司是否盈利,若盈利的话,计算可能的盈利最大值。

输入:

输入为两个整数 s 和 d 。

输出:

对于每一组的输入数据,若盈利的话,那么输出可能盈利最大值;若亏损的话,输出 Deficit。

样例输入:

59 237

375 743

200000 849694

2500000 8000000

样例输出:

116

28

300612

 Deficit

 

 

分析:看题得知盈利月和亏损月各自的盈利和亏损是固定的,一年只有12个月,它又是每5个月做一次报告,那么一年撑死做两次报告,我们划分为前5个月和后5个月,由于盈利和亏损的值是个固定的,那么实质上前五个月和后五个月本质上是相同的,即后五个月是前五个月的一个复制罢了。关键是要如何安排亏损月和盈利月的位置,假设5个月至少亏损3个月,那么对前五个月来说,亏损的月份必定是3,4,5月份,为什么?前面分析过这两个5月本质是一样的,是前一个的重复,前五个月是ssddd,那后五个月也是是ssddd,剩下的月份就是ss了,达到最大利益,如果是dddss这种情况,那最后剩下的两个月份则为dd,这样无法达到最大利润,用贪心的思想合理排布亏损盈利情况即可解出此题。

 

 

 

#include <iostream>
using namespace std;
const int MAXN = 100005;
 
int temp[MAXN];
 
 
 
int main()
{
    int s, d;
    int i;
 
    while(cin >> s >> d)
    {
        int total = 0;
        for(i=1; i<=5; i++)
        {
            if(s * (5 - i) - d * i < 0)
            {
                break;                 //枚举出5个月中至少有i个亏损月
            }
        }
 
        //i == 5      dddddddddddd        此情况全年赤字
        //i == 4      sddddsddddsd
        //i == 3      ssdddssdddss
        //i == 2      sssddsssddss
        //i == 1      ssssdssssdss
        if(i == 4)
        {
            total = 3 * s - 9 * d;
        }
        else
        {
            total = (12 - 2 * i) * s - d * 2 * i;
        }
 
        if(i == 5 || total < 0)
        {
            cout << "Deficit" << endl;
        }
        else
        {
            cout << total << endl;
        }
    }
    return 0;
}

 

 

 

 

<think> 我们根据用户需求,结合站内引用,提取关于贪心算法和A*算法实现贪吃蛇游戏的关键信息。 引用[1]提到STM32使用A*算法完成贪吃蛇自动寻找食物。引用[4]提供了字符版本贪吃蛇的自动寻路函数,使用曼哈顿距离(类似贪心策略)选择方向,但容易死掉。 用户明确要求贪心算法和A*算法的代码实现。 贪心算法:每一步选择当前最优(即距离食物最近的可行方向),不考虑长期影响。引用[4]的代码就是贪心算法的例子(使用曼哈顿距离)。 A*算法:综合考虑从起点到当前点的实际距离(g)和当前点到终点的预估距离(h),选择f=g+h最小的路径。它比贪心算法更智能,可以找到最短路径,避免陷入局部最优。 由于引用中没有直接给出A*算法的完整代码,但提到了A*算法,我们将结合引用[1]和引用[4]的信息,以及A*算法的通用实现,来编写两个算法的代码片段(简化版,用于演示核心逻辑)。 注意:贪吃蛇的自动寻路算法需要解决两个问题: 1. 避免撞墙和撞到自己的身体。 2. 找到通往食物的路径。 我们分别用贪心算法和A*算法实现寻路函数(假设在网格地图中)。 贪心算法(类似引用[4]): 每次移动前,检查四个方向(上、下、左、右),计算每个方向移动一步后的位置到食物的曼哈顿距离,选择距离最小且不会导致碰撞的方向。 A*算法: 使用优先队列(按f值排序)来探索路径,直到找到食物位置。需要记录每个节点的父节点,以便回溯路径。 由于贪吃蛇的身体会移动,因此每次移动后地图状态都会改变。所以每次寻路都是重新规划。 下面分别给出两种算法的代码框架(使用C/C++风格,但简化以便理解): </think> 以下是贪吃蛇游戏使用贪心算法和A*算法的实现代码解析及示例: ### 一、贪心算法实现 贪心算法每次选择距食物最近的可行方向(曼哈顿距离),引用[4]提供了核心实现: ```c char whereGoNext() { char movable[4] = {'D','A','S','W'}; // 四个方向:下、左、上、右 int min = 9999, minDir; int direx[4] = {0, -1, 0, 1}; // X方向偏移 int direy[4] = {1, 0, -1, 0}; // Y方向偏移 for(int i = 0; i < 4; i++) { // 模拟移动 snakeX[0] += direx[i]; snakeY[0] += direy[i]; if(!gameover()) { // 检查是否碰撞 // 计算曼哈顿距离 int cost = fabs(snakeX[0]-foody) + fabs(snakeY[0]-foodx); if(min > cost) { min = cost; minDir = i; } } // 恢复位置 snakeX[0] -= direx[i]; snakeY[0] -= direy[i]; } return (min < 9999) ? movable[minDir] : 0; } ``` **特点**: 1. 使用曼哈顿距离$|Δx| + |Δy|$评估方向优劣 2. 时间复杂度$O(1)$,仅评估4个方向 3. 缺陷:易陷入局部最优(如被身体包围时) --- ### 二、A*算法实现 A*算法综合路径代价$g(n)$和启发函数$h(n)$,引用[1]提到其在STM32贪吃蛇中的应用: ```python def a_star_search(start, goal, grid): from heapq import heappush, heappop open_set = [] heappush(open_set, (0, start)) came_from = {} g_score = {start: 0} f_score = {start: heuristic(start, goal)} while open_set: _, current = heappop(open_set) if current == goal: return reconstruct_path(came_from, current) for neighbor in get_neighbors(current, grid): tentative_g = g_score[current] + 1 if neighbor not in g_score or tentative_g < g_score[neighbor]: came_from[neighbor] = current g_score[neighbor] = tentative_g f_score[neighbor] = tentative_g + heuristic(neighbor, goal) heappush(open_set, (f_score[neighbor], neighbor)) return [] # 无路径 def heuristic(a, b): # 曼哈顿距离启发函数 return abs(a[0] - b[0]) + abs(a[1] - b[1]) ``` **关键组件**: 1. $g(n)$:从起点到当前节点的实际代价 2. $h(n)$:启发函数(通常用曼哈顿距离) 3. $f(n) = g(n) + h(n)$:节点优先级评估 4. 需维护开放列表(优先队列)和关闭列表 --- ### 三、算法应用对比 | **特性** | 贪心算法 | A*算法 | |----------------|---------------------------|----------------------------| | **路径质量** | 局部最优,可能绕路 | 全局最优,最短路径 | | **时间复杂度** | $O(1)$ | $O(b^d)$ (b分支因子,d深度)| | **内存消耗** | 极低 | 需存储节点信息 | | **适用场景** | 简单环境、实时性要求高 | 复杂障碍环境 | > 💡 **实际应用建议**: > - 简单场景用贪心算法(如引用[4]的字符版贪吃蛇) > - 复杂场景用A*算法(如引用[1]的STM32嵌入式实现) > - 可结合两种算法:先用A*规划长路径,再用贪心实时避障
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值