zoj - 2928 - Mathematical contest in modeling(爬山)

2023-11-03 12:32

本文主要是介绍zoj - 2928 - Mathematical contest in modeling(爬山),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:空间中有 n(3 <= n <= 100) 个点(0.00 <= ai, bi, ci <= 1000.00),求到这 n 个点的距离之和最短的一点。

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2928

——>>如果是一维的,那么答案是中位数;现在是三维的,赛时不会,赛后学了一种叫做爬山的随机算法用于这题。

爬山算法:先选取其中一值作为最优值,然后向该值附近扫描,若发现更优的值,则以该更优值作为最优值,继续迭代扫描;否则所选值已是最优值。。

此题我以(0, 0, 0)作为初始最优值,然后往其27个可前进方向移动寻找更优值。

精度的设置要特别小心。。1e-8的精度过不了。。

#include <cstdio>
#include <cmath>const int MAXN = 100 + 10;
const int MAXD = 30;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-12;
const double rate = 0.99;int n;
int dx[MAXD];
int dy[MAXD];
int dz[MAXD];
int dcnt;
double a[MAXN];
double b[MAXN];
double c[MAXN];
double A, B, C;void Read()
{for (int i = 0; i < n; ++i){scanf("%lf%lf%lf", a + i, b + i, c + i);}
}void getDirection()
{dcnt = 0;for (int i = -1; i <= 1; ++i){for (int j = -1; j <= 1; ++j){for (int k = -1; k <= 1; ++k){dx[dcnt] = i;dy[dcnt] = j;dz[dcnt] = k;++dcnt;}}}
}int Dcmp(double x)
{if (fabs(x) < EPS) return 0;return x > 0 ? 1 : -1;
}void Solve()
{double step = 1000;double minDistance = INF;A = B = C = 0;getDirection();while (Dcmp(step) != 0){for (int i = 0; i < dcnt; ++i){double newx = A + dx[i] * step;double newy = B + dy[i] * step;double newz = C + dz[i] * step;double sumOfDistance = 0;if (Dcmp(newx) < 0 || Dcmp(newx - 1000) > 0 ||Dcmp(newy) < 0 || Dcmp(newy - 1000) > 0 ||Dcmp(newz) < 0 || Dcmp(newz - 1000) > 0) continue;for (int j = 0; j < n; ++j){sumOfDistance += sqrt((a[j] - newx) * (a[j] - newx) + (b[j] - newy) * (b[j] - newy) + (c[j] - newz) * (c[j] - newz));}if (Dcmp(sumOfDistance - minDistance) < 0){minDistance = sumOfDistance;A = newx;B = newy;C = newz;}}step *= rate;}
}void Output()
{printf("%.3f %.3f %.3f\n", A, B, C);
}int main()
{while (scanf("%d", &n) == 1){Read();Solve();Output();}return 0;
}



这篇关于zoj - 2928 - Mathematical contest in modeling(爬山)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338197

相关文章

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

UML- 统一建模语言(Unified Modeling Language)创建项目的序列图及类图

陈科肇 ============= 1.主要模型 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功能,包括用例图。 对象模型:采用对象、属性、操作、关联等概念展示系统的结构和基础,包括类图、对象图、包图。 动态模型:展现系统的内部行为。 包括序列图、活动图、状态图。 因为要创建个人空间项目并不是一个很大的项目,我这里只须关注两种图的创建就可以了,而在开始创建UML图

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(