先说一下叉积求面积
View Code
1 struct node 2 { 3 int x; 4 int y; 5 }point[N]; // 数组保存多边形顶点,但是必须按顺序(逆或顺)保存 6 double area(int n) // n 表示多边形的顶点数 7 { 8 int i; 9 double a = 0;10 for(i = 0; i < n; i++)11 {12 int j = (i + 1) % n; // 保证最后一个和第一个连起来13 a += point[i].x * point[j].y - point[i].y * point[j].x;14 }15 if(a < 0) a = -a; // 注意叉积求出来的面积可能为负16 return (a / 2);17 }
然后下面的题目是相当简单的
题目:
View Code
1 typedef long long ll; 2 const int inf = 100000007; 3 const double pi = sqrt(3.0) / 2.0; 4 const double eps = 1e-8; 5 int area[10][2] = { { 0,0},{ 1,-1},{ 1,0},{ 1,1},{ 0,-1},{ 0,0},{ 0,1},{-1,-1},{-1,0},{-1,1}}; 6 int main() 7 { 8 ll ans; 9 int t;10 char ch;11 scanf("%d",&t);12 getchar();13 while(t--)14 {15 int x1 = 0, y1 = 0;16 ans = 0;17 while(scanf("%c",&ch),ch != '5')18 {19 int x2 = area[ch - '0'][0] + x1;20 int y2 = area[ch - '0'][1] + y1;21 ans += x1 * y2 - y1 * x2;22 x1 = x2, y1 = y2;23 }24 if(ans < 0) ans = -ans;25 if(ans % 2) printf("%.1lf\n",(double)(ans) / 2);26 else printf("%I64d\n",ans / 2);27 }28 return 0;29 }
题目:
题意:给三个点在蛋糕上,问是否可以把蛋糕平分成三份而且每一份上有一个点
View Code
1 typedef long long ll; 2 const int inf = 100000007; 3 const double pi = acos(-1.0); 4 const double eps = 1e-8; 5 int x[3],y[3],r; 6 int pows(int x) 7 { 8 return x * x; 9 }10 double geta(double x1,double y1,double x2,double y2)11 {12 double a = acos((pows(x1) + pows(y1) + pows(x2) + pows(y2) - pows(x1 - x2) - pows(y1 - y2)) / (2 * sqrt((double)(pows(x1) + pows(y1))) * sqrt((double)(pows(x2) + pows(y2))))); // 根据余弦定理求cos值13 return a * 180.0 / pi; // 算出角度14 }15 bool juge()16 {17 int i,j,k;18 double a1,a2;19 for(i = 0; i < 3; i++)20 {21 int temp = 0;22 j = (i + 1) % 3, k = (i + 2) % 3;23 a1 = geta(x[0],y[0],x[j],y[j]);24 a2 = geta(x[j],y[j],x[k],y[k]);25 temp = int(a1 == 120.0) + int(a2 == 120.0); // 题目保证了三个点都在园上,所以如果两个角都是 120,那么肯定可以26 if(temp == 2) return true;27 if(a1 > 120.0 && a2 > 120.0) continue; // 如果两个都大于 120,继续判断28 if(a1 < 120.0 && a2 < 120.0) continue; // 同理29 if(a1 != 0.0 && a2 != 0.0) return true; // 两个交都不同时大于 120 也不小于 120,也不为零,那么肯定可以30 }31 return false;32 }33 int main()34 {35 //freopen("data.txt","r",stdin);36 int i,t;37 scanf("%d",&t);38 while(t--)39 {40 scanf("%d%d%d%d%d%d%d",&r,&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]);41 int flag = 0;42 for(i = 0; i < 3; i++)43 if(x[i] == 0 && y[i] == 0) // 如果有某个点在中心,那么一定不可以44 {45 flag = 1;46 break;47 }48 if(!flag && juge()) printf("Yes\n");49 else printf("No\n");50 }51 return 0;52 }