题意:给你坐标和n个点,求最少移动的点使得n个点成等差数列
思路:既然要成等差数列,那么最起码有两个点是不动的,然后枚举这两个点中间的点的个数,最近水的要死,看了队友的代码做的
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const double eps = 1e-9; const int INF = 0x3f3f3f3f; int n; double x[45]; int main() { int cas = 1,t; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%lf", &x[i]); sort(x, x+n); printf("Case #%d: ", cas++); if (n == 1){ printf("0\n"); continue; } int ans = INF; for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) for (int k = 1; k < n; k++) { int count = 0; double d = (x[j]-x[i])/k; double cur = x[i]-d; int cnt = 0; for (int l = 0; l < n; l++) { cur += d; while (x[cnt] < cur && cnt < n) cnt++; if (cnt == n) break; if (fabs(cur-x[cnt]) < eps) { count++; cnt++; } } ans = min(ans, n-count); } printf("%d\n", ans); } return 0; }
北京邀请赛 B. Beautiful Garden,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u011345136/article/details/27676411