牛客oj 习题7.1代理服务器(经典贪心)

这篇博客讨论了一个经典的贪心算法问题——牛客oj中的7.1代理服务器。作者指出,最初的直觉可能并不正确,正确的策略是每次都选择能代理最多服务器的代理。由于问题具有无后效性,贪心策略得以应用。文章强调了初始化step数组的重要性,以及特殊情况的处理,即只有单个代理时可能会导致无法抵达所有服务器。作者认为,贪心算法虽然看似简单,但在实际解题中可能因灵活性高而增加难度,建议在非竞赛环境下,面对难以快速解决的问题时,可以适当地接受挑战的局限性。

 

经典贪心问题,刚开始怎么也看不懂题,寻思着要想切换次数尽可能少,直接找个和所有服务器都不相同的代理服务器或者找个最迟出现的和代理服务器相同的服务器不就好了。。想了很久才意识到这个最迟出现的代理服务器相同的服务器可以多次出现,这样在切换这个最迟服务器之前(要想抵达这里代理服务器ip必须和这个服务器相同)前面由于也是同名代理服务器所以必定会卡死,所以要考虑到要访问服务器出现多次的情况。

既然如此,问题就转化为每次都选取一个代理服务器,使他代理的服务器尽可能多。由于服务器访问是顺序访问,所以可以用步数代替,故转化为每次选取一个代理使他走的步数尽可能多。由于无后效性(当前一步和前一步无关),贪心策略达成。

这题还是卡了我很久,原因在于step数组初始化位置错误,然后答案还显示不出错,很隐蔽,用排除法才找到错。。。还有,本题需要考虑特殊情况,出现无法抵达的情况只可能是代理只有一个的时候,因为一旦一个以上,都可以通过切换改变当前代理后通过。综上,好题。

 

说起贪心,贪心思想就是只要找出当前最优解即可,说起来简单,可是题目好多时候灵活性过于强,和DP有类似之处,感觉有思路就是在有限时间内写不出来。对于这种情况,我认为如果不是参加比赛的话可以适当放弃,毕竟任何人智商还是有差距的,拿自己的短板刚对手的长项,并不合理。

 

 

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <cmath>
#include <climits>
 
using namespace std;
 
const int MAXN = 100005;
const int INF = INT_MAX
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值