Why so serious? --[NKU]schindlerlee

2010年1月27日星期三.sgu136

2010年1月27日星期三.sgu136

sgu136:高斯消元的特殊形式

题目给出了一个n边形每个边的中点,也就相当于给出了两组方程。

(+) x0 + x1 = in[0][0]
(-) x1 + x2 = in[1][0]
(+) x2 + x3 = in[2][0]
(-) x3 + x0 = in[3][0]

(+) y0 + y1 = in[0][1]
(-) y1 + y2 = in[1][1]
(+) y2 + y3 = in[2][1]
(-) y3 + y0 = in[3][1]

然后对于这两组方程,分别按照奇偶关系,直接将四组值奇加偶减
直接求出x0,y0,
然后分别带入下面的式子挨个计算即可。


 1 int main()
 2 {
 3   int i,j,k;
 4   scanf("%d",&n);
 5   for (i = 1;i <= n;i++) {
 6       scanf("%lf %lf",x + i,y + i);
 7       x[i] *= 2;
 8       y[i] *= 2;
 9   }
10 
11   for (i = 1;i <= n;i++) {
12       if(i & 1) {
13           rx[0+= x[i];
14           ry[0+= y[i];
15       }else {
16           rx[0-= x[i];
17           ry[0-= y[i];
18       }
19   }
20 
21   if (n & 1) {
22       puts("YES");
23       rx[0/= 2, ry[0/= 2;
24       for (i = 1;i < n;i++) { rx[i] = x[i] - rx[i-1]; }
25       for (i = 1;i < n;i++) { ry[i] = y[i] - ry[i-1]; }
26       for (i = 0;i < n;i++) {
27           printf("%f %f\n",rx[i],ry[i]);
28       }
29   } else if((n & 1== 0 && rx[0== 0 && ry[0== 0) {
30       puts("YES");
31       for (i = 1;i < n;i++) { rx[i] = x[i] - rx[i-1]; }
32       for (i = 1;i < n;i++) { ry[i] = y[i] - ry[i-1]; }
33       for (i = 0;i < n;i++) {
34           printf("%f %f\n",rx[i],ry[i]);
35       }
36   } else {
37       printf("NO\n");
38   }
39   return 0;
40 }
41 

posted on 2010-01-28 21:29 schindlerlee 阅读(1022) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理