int main() { int i, k, j; double sum_of_x, sum_of_y; double max_of_x, max_of_y; double min_of_x, min_of_y; double x_now, y_now; double x_add, y_add; double step; double dis, min; int con[4][2] = {0, 1, 0, -1, 1, 0, -1, 0}; sum_of_x = sum_of_y = 0; max_of_x = max_of_y = 0; min_of_x = min_of_y = 99999; scanf("%d", &N); for(i = 0; i < N; i++) { scanf("%lf%lf", &x[i], &y[i]); sum_of_x += x[i], sum_of_y += y[i]; if(x[i] > max_of_x) max_of_x = x[i]; if(x[i] < min_of_x) min_of_x = x[i]; if(y[i] > max_of_y) max_of_y = y[i]; if(y[i] < min_of_y) min_of_y = y[i]; } x_now = sum_of_x / N; y_now = sum_of_y / N; step = (max_of_x - min_of_x) + (max_of_y - min_of_y); while(step > P) { min = INF; for(i = 0; i < 4; i++) { dis = 0; x_add = x_now + con[i][0] * step; y_add = y_now + con[i][1] * step; for(k = 0; k < N; k++) dis += get_dis(x_add, y_add, x[k], y[k]); if(min > dis) { min = dis; j = i; } } dis = 0; for(i = 0; i < N; i++) dis += get_dis(x_now, y_now, x[i], y[i]); if(min < dis) x_now = x_now + con[j][0] * step, y_now = y_now + con[j][1] * step; else step /= 2; } printf("%.0lf\n", min); return 0; }
double dis(point a, point b, point c) { double mul = ( (a - b) ^ (c - b) ) / (c - b).len(); point dir = (c - b).set(); point mid = dir * mul + b; if( sgn((mid - b) ^ (c - b) ) >= 0 && sgn((mid - c) ^ (b - c)) >= 0) { return fabs((a - b) * (c - b) / (c - b).len()); } else return get_dis(a, b, c); }
int main(int argc, char *argv[]) { prepare(); base_info vm_base_info; vm_base_info.issue = get_dis(); vm_base_info.hostname = get_hostname(); vm_base_info.kernel = get_kernel(); vm_base_info.arch = get_arch(); printf("%d %d\n", vm_base_info.issue, vm_issue); printf("%s\n", vm_base_info.hostname); printf("%s\n", vm_base_info.kernel); printf("%s\n", vm_base_info.arch); /* TODO: not forget memory free */ }
//返回最近的roadid int get_nearest_road(double x, double y) { int rid = 0; //真正最近路段id int start, end; //每条路的起始点 int road, i=1; double dis=361.0, temp; while(arr_pzroad[i]) //每条路都得查找 { road = arr_pzroad[i]->id; //找到roadid start = arr_proad[road]->child[0]; //通过roadid找到roadnode起始和终止点 end = arr_proad[road]->child[1]; temp = get_dis(start, end, x, y); if(temp<dis) //dis记录最小的 { dis = temp; rid = road; } i++; } return rid; }
int main() { int n, m; while (EOF != scanf("%d%d", &n, &m)) { for (int i = 0; i < n; ++i) scanf("%d%d", &pt[i].x, &pt[i].y); for (int i = 0; i < n; ++i) scanf("%d", &c[i]); int all = (1<<n) - 1; int n_st = 0; memset(f, -1, sizeof(f)); for (int i = 0; i <= all; ++i) { int t = get_t(i); if (t <= m) { f[i] = 1; st[n_st++] = i; } } for (int s = 1; s <= all; ++s) { for (int j = 0; j < n_st; ++j) { if ((s & st[j]) == 0 && f[s] != -1) { int s2 = s | st[j], t = f[s] + f[st[j]]; if (f[s2] == -1 || f[s2] > t) f[s2] = t; } } } int ans1 = f[all]; if (ans1 == -1) { puts("-1 -1"); continue; } memset(ct, -1, sizeof(ct)); for (int i = 1; i < n; ++i) { ct[1<<i|1][i] = get_dis(pt[0], pt[i]); } for (int s = 1; s <= all; ++s) { for (int i = 1; i < n; ++i) { if ((s & (1<<i)) && ct[s][i] != -1) { for (int j = 1; j < n; ++j) { if (s & (1<<j)) continue; int s2 = s | (1<<j); if (get_t(s2) <= m) { int t = ct[s][i] + get_dis(pt[i], pt[j]); if (ct[s2][j] == -1 || ct[s2][j] > t) { ct[s2][j] = t; } } } } } } memset(f, -1, sizeof(f)); for (int s = 1; s <= all; ++s) { for (int i = 1; i < n; ++i) { if ((s & (1<<i)) && ct[s][i] != -1) { ct[s][i] += get_dis(pt[0], pt[i]); if (f[s] == -1 || f[s] > ct[s][i]) f[s] = ct[s][i]; } } } n_st = 0; for (int s = 1; s <= all; ++s) { if (f[s] != -1) st[n_st++] = s; } for (int s = 1; s <= all; ++s) { for (int j = 0; j < n_st; ++j) { if (0 == ((s&st[j])^1) && f[s] != -1) { int s2 = s | st[j], t = f[s] + f[st[j]]; if (f[s2] == -1 || f[s2] > t) f[s2] = t; } } } printf("%d %d\n", ans1, f[all]); } return 0; }