经典贪心问题,刚开始怎么也看不懂题,寻思着要想切换次数尽可能少,直接找个和所有服务器都不相同的代理服务器或者找个最迟出现的和代理服务器相同的服务器不就好了。。想了很久才意识到这个最迟出现的代理服务器相同的服务器可以多次出现,这样在切换这个最迟服务器之前(要想抵达这里代理服务器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

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

被折叠的 条评论
为什么被折叠?



