Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n, inp[50];
- double mans;
- struct point{
- double x, y;
- point(double _x, double _y){
- x = _x;
- y = _y;
- }
- };
- struct st{
- int x, r;
- st( int _x, int _r){
- x = _x;
- r = _r;
- }
- };
- double dist(point p1, point p2){
- return hypot(p1.x - p2.x, p1.y - p2.y);
- }
- double fnc2(vector<point> pt, double &an, double rd){
- double l = 0.0, r = an + r + 10, mid ;
- int fl = 0;
- for(int i=0; i<100; i++){
- mid = (l + r)/2;
- fl = 0;
- for(int j = 0; j<pt.size(); j++){
- if(mid<pt[j].x){
- l = mid; fl = 1;
- break;
- }
- if(dist(pt[j], point(mid, r)) < pt[j].y + rd){
- l = mid;
- fl = 1;
- break;
- }
- }
- if (fl == 0){
- r = mid;
- }
- }
- if(mid + rd > an) an = rd;
- return mid;
- }
- void fnc(int i, vector<st> &rd, vector<point> &pt, double ans){
- cout<< i << " " << ans<<endl;
- if(i==n){
- cout << i << endl;
- for(int x = 0 ; x< pt.size(); x++) {
- cout<< " - > " << pt[x].x << " " << pt[x].y<<endl;
- }
- if (ans < mans )mans = ans;
- return;
- }
- double tmp;
- for(int j=0; j<rd.size(); j++){
- if(rd[j].r > inp[i]){
- tmp = rd[j].r ;
- rd[j].r = inp[i];
- pt.push_back(point(rd[j].x, inp[i]));
- fnc(i+1, rd, pt, ans);
- rd[j].r = tmp;
- pt.pop_back();
- }
- }
- double tm = ans;
- double x = fnc2(pt, tm, inp[i]);
- pt.push_back(point(x, inp[i]));
- fnc(i+1, rd, pt, tm);
- pt.pop_back();
- }
- int main(){
- freopen("input.txt", "r", stdin);
- int nn;
- scanf("%d", &nn);
- for(int i=1; i<=nn; i++){
- scanf("%d", &n);
- for(int j=0; j<n; j++)scanf("%d", &inp[i]);
- vector<st> vc;
- vc.push_back(st(inp[0], inp[0]));
- vector<point>pt;
- pt.push_back(point(inp[0], inp[0]));
- mans = 99999999;
- fnc(1, vc, pt, inp[0]*2.0);
- printf("Case 1: %lf\n", mans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement