题意 : 有一块棋盘式的场地和一个魔术师,场地中有n道墙,魔术师一次最多能穿越k道墙。求移除最少数量的墙,使得魔术师可以在场地的任意一列表演都可以成功。
虽然自己感觉出这题应该用贪心来做,并且找到了一个自己看来很正确的贪心思路,也简单的证明了我的贪心策略的正确性,但还是WA了。
问题出在了哪,我觉得问题出在了第三个环节对贪心选择正确性的证明上。其一,我的证明太过简单,根本没考虑证明本身是否成立;其二,我太懒,这就导致我太过依赖Sample中的几个例子,即使自己找反例时,思维也不能摆脱样例的束缚,这也是导致最终证明失败的原因。
以后要锻炼自己思维的严谨性,另外也深切的感觉到自己的数学功底还需很大的提高;还有就是要勤奋,无论是思考,还是动手。
看了discuss别人的贪新策略,自己在总结一下。
用二维数组来表示场地
思路 : 从左向右扫描场地的每一列是否合法。若不合法,贪心的找出从该列起向右延伸最长的m道墙,移除这m道墙使得该列合法。
证明 :
可以通过循环不变式证明这个方法确实可以达到一个合法的最终状态,但如何证明解是最优的还没有好办法。。
#include <iostream>
using namespace std;
const int White = 0;
int n, k;
int w, h;
short g[101][101];
int Greedy()
{
int minCount = 0;
for( int c = 0; c <= w; ++ c ) {
// 扫描每一行,找出墙数num
int num = 0;