题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=11035&rd=14236
这道题目在TopCoder的比赛的数据中正确率不到%10, 我一开始觉得题目挺简单, 就是一个简单的排列组合问
题, 但做完提交后, system test 挂掉了, 一看挂掉的测试数据, 原来是当参数numFriends为1的时候, 计算行和列
的时候会重复, 要除以2才是正确结果. 或当numFriends为1的时候只考虑行或只考虑列.
题目给出的样例测试数据中没有包含这种情况, 大部分人都忽略了考虑这种情况, 所以才有这超低的正确率.
代码如下:
#include <string>
#include <vector>
using namespace std;
/************** Program Begin *********************/
/**
* calculate A(n, m)
*/
long long calc(int m, int n)
{
long long sum = 1;
for (int i = 1; i <= m; i++) {
sum *= n;
--n;
}
return sum;
}
class MovieSeating {
public:
long long getSeatings(int numFriends, vector <string> hall) {
long long res = 0;
for (int i = 0; i < hall.size(); i++) {
int seats = 0;
for (int j = 0; j < hall[i].size(); j++) {
if ('.' == hall[i][j]) {
++seats;
}
}
if (seats >= numFriends) {
res += calc(numFriends, seats);
}
}
if (numFriends > 1) {
for (int i = 0; i < hall[0].size(); i++) {
int seats = 0;
for (int j = 0; j < hall.size(); j++) {
if ('.' == hall[j][i]) {
++seats;
}
}
if (seats >= numFriends) {
res += calc(numFriends, seats);
}
}
}
return res;
}
};
/************** Program End ************************/