250.SpiralNumbers

         21  22  23  24  25  26
         20   7   8   9  10 ...
         19   6   1   2  11 ...
         18   5   4   3  12 ...
         17  16  15  14  13 ...在这样的数数规则,求N(between 1 and 2,147,483,647)的坐标

string getPosition(int N)
直接从1开始模拟不断的加cnt一直加到N,每加两次cnt后cnt++,注意处理边界于是可以得到O(sqrt(N))的算法~

500.Knights

没你一个棋盘中很多骑士的位子,如果两个骑士互不攻击,那么就是友好的,问你至少去掉多少个骑士可以让剩下的骑士都是友好关系

int makeFriendly(int N, vector <string> pos)
很裸的二分匹配
求出两个骑士是否攻击后,做一个最大匹配,由于是双向的,所以最后匹配值要除以2

1000.FourBears

给你一个地图,有4个熊,问你最少要建多少道路才能将4个熊全部连起来~

int clearPassages(vector <string> field)
解题报告说枚举两个碰头点(n*m)^2,复杂度较搞,而且如果有不止4个熊的话就不好办了
用[n][m][1<<4]的状态就可以解决这个问题,表示到点(i,j)并且状态为st个熊已经连接的最小步数,用优先队列的bfs完美解决

Popularity: 9% [?]