SRM 585 Div II Level Three: EnclosingTriangleColorful

来源:互联网 发布:葫芦侠软件源 编辑:程序博客网 时间:2024/09/21 09:26

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


原创粉丝点击