SRM 585 Div II Level Three: EnclosingTriangleColorful

题目来源: 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 ************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值