题目来源: http://community.topcoder.com/stat?c=problem_statement&pm=12694&rd=15697
这题目还是有一定难度的, 如果按照一般的思路, 遍历所有可能的三角形, 每个三角形再检查是否满足要求, 可以用判
断斜率的方法检查, 这样的话最多需要4*300*300*300*50次操作, 会超过时间限制, 事实也确实如此, 我之前用这种最
简单的方法, coding起来最容易, 但运行时间太长了, 所以必需采取优化措施.
代码如下:
#include <vector>
using namespace std;
/************** Program Begin *********************/
struct rec {
int x;
int y;
};
const int MaxN = 50;
static rec p[MaxN];
void rotate(int m)
{
for (int i = 0; i < MaxN; i++) {
int temp = p[i].x;
p[i].x = m - p[i].y;
p[i].y = temp;
}
}
int cacl(int m, int n)
{
int ans = 0;
for (int j = 1; j < m; j++) {
int first = 0;
int two = 0;
for (int u = 1; u < n; u++) {
if ( (p[u].y - j) * p[first].x > (p[first].y - j) * p[u].x ) {
first = u;
}
if ( (p[u].y - j) * p[two].x < (p[two].y - j) * p[u].x ) {
two = u;
}
}
for (int k = 1; k < m; k++) {
int three = 0;
for (int u = 1; u < n; u++) {
if ( (k-p[u].y)*(m-p[three].x) < (k-p[three].y)*(m-p[u].x) ) {
three = u;
}
}
for (int i = 1; i < m; i++) {
if (
(m-j)*p[first].x < (p[first].y-j)*i ||
(k-j)*p[two].x > (p[two].y-j)*m ||
(k-m)*(m-p[three].x) > (k-p[three].y)*(m-i)
) {
continue;
}
++ans;
}
}
}
return ans;
}
class EnclosingTriangleColorful {
public:
int getNumber(int m, vector <int> x, vector <int> y);
};
int EnclosingTriangleColorful::getNumber(int m, vector<int> x, vector<int> y)
{
int ans = 0;
int n = x.size();
for (int i = 0; i < n; i++) {
p[i].x = x[i];
p[i].y = y[i];
}
for (int i = 0; i < 4; i++) {
ans += cacl(m, n);
rotate(m);
}
return ans;
}
/************** Program End ************************/