Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <algorithm>
- using namespace std;
- int n, k;
- double x[111], y[111];
- double val[111][111];
- double opt[111][111];
- double getY(int p, int q) {
- //cout << p <<" "<< q <<" " << -(y[p] - y[p - 1]) / (x[p] - x[p - 1]) * x[q] - y[q] <<endl;
- return (y[p] - y[p - 1]) / (x[p] - x[p - 1]) * (x[q]-x[p])+y[p] - y[q];
- }
- double calc(int i, int j) {
- double ret = 0;
- for (int k = i; k < j; k++) {
- if ((i > 0 && i < n)&&(j > 0 && j < n)) ret=max(ret,min(getY(i,k),getY(j,k)));
- else if (i > 0 && i < n)
- ret = max(ret, getY(i, k));
- else if (j > 0 && j < n)
- ret = max(ret, getY(j, k));
- //cout << ret <<endl;
- }
- //cout << i <<" " << j << " "<< ret <<endl;
- return ret;
- }
- int main() {
- while (cin >> n >> k) {
- if(!n&&!k) break;
- k++;
- for (int i = 0; i < n; i++)
- scanf("%lf%lf", &x[i], &y[i]);
- for (int i = 0; i <= n; i++)
- for (int j = i + 1; j <= n; j++)
- val[i][j] = calc(i, j);
- for (int i = 0; i <= n; i++)
- for (int j = 0; j <= k; j++) opt[i][j]=1e10;
- opt[0][0] = 0;
- for (int i = 0; i <= n; i++)
- for (int j = 0; j <= k; j++)
- for (int p = i + 1; p <= n; p++) {
- if (i==0&&p==n) continue;
- opt[p][j + 1] = min(opt[p][j + 1],max(opt[i][j], val[i][p]));
- }
- //for (int i = 0; i <= n; i++){
- // for (int j = 0; j <= k; j++)
- // cout << opt[i][j] <<" ";
- // puts("");
- //}
- printf("%.3lf\n",opt[n][k]);
- }
- }
- /*
- 6 2
- 0.0 0.0
- 1.0 3.0
- 3.0 6.0
- 6.0 9.0
- 8.0 10.0
- 17.0 12.0
- 0 0
- */
Add Comment
Please, Sign In to add comment