poj1113 Wall 凸包问题 官方数据

http://poj.org/problem?id=1113

题意:给定n个点,建一个围墙,围住所有点,并且墙与所有点的距离不得小于L,求这个墙最小的长度。

解题:凸包边长+L半径圆周长

copy一个证明:http://blog.sina.com.cn/s/blog_687916bf0100jq9g.html

证明如下:假如顺时针给出四个点A、B、C、D。组成了凸四边形ABCD。我们不妨过A点作AE垂直于AB,同时过A点再作AF垂直于AD,过B点作BG、BH分别垂直于AB、BC。连结EG,垂线段的长度为L,过A点以AE为半径作一段弧连到AF,同理,使GH成为一段弧。此时EG=AB(边),AB段城墙的最小值为EF+弧EF+弧GH=AB+弧EF+弧GH
。对所有点进行同样的操作后,可知城墙的最小值=四边形的周长+相应顶点的弧长(半径都为L)之和。
下面证明这些顶点弧长组成一个圆。依然以前面的四边形为例。A、B、C、D四顶点各成周角,总和为360*4=1440度,四边形内角和为360度,每个顶点作两条垂线,总角度为4*2*90=720度,所以总圆周角为1440-360-720=360度,刚好组成圆。
所以四边形ABCD的围墙最短= 四边形的周长+圆周长。
推广到任意多边形,用同样的方法,城墙最短=凸包的周长 + 以L为半径的圆的周长。
首先,我们得出城墙最短=凸包的周长 + 相应顶点的弧长(半径都为L)之和。
再证明 相应顶点的弧长(半径都为L)之和=以L为半径的圆的周长。
事实上,设凸包顶点为n,n个顶点组成n个周角,角度为360*n=2*180*n,凸包的内角和为180*(n-2),作了2*n条垂线,和为2*n*90=180*n,所以总圆周角为2*180*n-180*(n-2)-180*n=360,组成圆。
in

3 100
0 0
0 3000
4000 0

out

12628

in

4 1000
10000 10000
10000 -10000
-10000 -10000
-10000 10000

out

86283

in

4 1
10000 -10000
-10000 -10000
-10000 10000
10000 10000

out

80006

in

17 2
5 3
6 2
5 1
4 0
2 1
1 1
2 0
0 0
0 2
1 3
2 4
1 2
2 2
3 3
4 2
5 2
4 4

out

29

in

1000 1000
-8488 5287
-8455 5340
-8421 5393
-8387 5446
-8353 5498
-8318 5551
-8283 5603
-8248 5655
-8212 5706
-8176 5758
-8140 5809
-8103 5860
-8066 5911
-8029 5962
-7991 6012
-7953 6062
-7915 6112
-7876 6161
-7837 6211
-7798 6260
-7759 6309
-7719 6357
-7679 6406
-7638 6454
-7598 6502
-7557 6549
-7515 6597
-7474 6644
-7432 6691
-7390 6737
-7347 6784
-7305 6830
-7261 6875
-7218 6921
-7175 6966
-7131 7011
-7086 7056
-7042 7100
-6997 7144
-6952 7188
-6907 7232
-6861 7275
-6815 7318
-6769 7360
-6723 7403
-6676 7445
-6629 7487
-6582 7528
-6535 7569
-6487 7610
-6439 7651
-6391 7691
-6343 7731
-6294 7771
-6245 7810
-6196 7849
-6146 7888
-6097 7927
-6047 7965
-5996 8003
-5946 8040
-5895 8077
-5845 8114
-5793 8151
-5742 8187
-5691 8223
-5639 8259
-5587 8294
-5535 8329
-5482 8363
-5429 8398
-5377 8432
-5324 8465
-5270 8499
-5217 8531
-5163 8564
-5109 8596
-5055 8628
-5001 8660
-4946 8691
-4891 8722
-4837 8753
-4781 8783
-4726 8813
-4671 8842
-4615 8871
-4559 8900
-4503 8929
-4447 8957
-4391 8985
-4334 9012
-4277 9039
-4221 9066
-4164 9092
-4106 9118
-4049 9144
-3991 9169
-3934 9194
-3876 9218
-3818 9242
-3760 9266
-3701 9290
-3643 9313
-3584 9336
-3526 9358
-3467 9380
-3408 9401
-3349 9423
-3289 9444
-3230 9464
-3170 9484
-3111 9504
-3051 9523
-2991 9542
-2931 9561
-2871 9579
-2811 9597
-2750 9614
-2690 9631
-2629 9648
-2569 9664
-2508 9680
-2447 9696
-2386 9711
-2325 9726
-2264 9740
-2203 9754
-2141 9768
-2080 9781
-2018 9794
-1957 9807
-1895 9819
-1833 9830
-1772 9842
-1710 9853
-1648 9863
-1586 9873
-1524 9883
-1462 9893
-1399 9902
-1337 9910
-1275 9918
-1213 9926
-1150 9934
-1088 9941
-1025 9947
-963 9954
-900 9959
-838 9965
-775 9970
-712 9975
-650 9979
-587 9983
-524 9986
-461 9989
-399 9992
-336 9994
-273 9996
-210 9998
-147 9999
-85 10000
-22 10000
41 10000
104 9999
167 9999
230 9997
292 9996
355 9994
418 9991
481 9988
543 9985
606 9982
669 9978
732 9973
794 9968
857 9963
919 9958
982 9952
1045 9945
1107 9939
1169 9931
1232 9924
1294 9916
1356 9908
1419 9899
1481 9890
1543 9880
1605 9870
1667 9860
1729 9849
1791 9838
1852 9827
1914 9815
1976 9803
2037 9790
2099 9777
2160 9764
2222 9750
2283 9736
2344 9721
2405 9707
2466 9691
2527 9676
2587 9659
2648 9643
2709 9626
2769 9609
2829 9591
2890 9573
2950 9555
3010 9536
3069 9517
3129 9498
3189 9478
3248 9458
3308 9437
3367 9416
3426 9395
3485 9373
3544 9351
3602 9329
3661 9306
3719 9283
3778 9259
3836 9235
3894 9211
3952 9186
4009 9161
4067 9136
4124 9110
4181 9084
4238 9058
4295 9031
4352 9004
4408 8976
4464 8948
4521 8920
4576 8891
4632 8862
4688 8833
4743 8803
4798 8774
4854 8743
4908 8713
4963 8682
5017 8650
5072 8618
5126 8586
5180 8554
5233 8521
5287 8488
5340 8455
5393 8421
5446 8387
5498 8353
5551 8318
5603 8283
5655 8248
5706 8212
5758 8176
5809 8140
5860 8103
5911 8066
5962 8029
6012 7991
6062 7953
6112 7915
6161 7876
6211 7837
6260 7798
6309 7759
6357 7719
6406 7679
6454 7638
6502 7598
6549 7557
6597 7515
6644 7474
6691 7432
6737 7390
6784 7347
6830 7305
6875 7261
6921 7218
6966 7175
7011 7131
7056 7086
7100 7042
7144 6997
7188 6952
7232 6907
7275 6861
7318 6815
7360 6769
7403 6723
7445 6676
7487 6629
7528 6582
7569 6535
7610 6487
7651 6439
7691 6391
7731 6343
7771 6294
7810 6245
7849 6196
7888 6146
7927 6097
7965 6047
8003 5996
8040 5946
8077 5895
8114 5845
8151 5793
8187 5742
8223 5691
8259 5639
8294 5587
8329 5535
8363 5482
8398 5429
8432 5377
8465 5324
8499 5270
8531 5217
8564 5163
8596 5109
8628 5055
8660 5001
8691 4946
8722 4891
8753 4837
8783 4781
8813 4726
8842 4671
8871 4615
8900 4559
8929 4503
8957 4447
8985 4391
9012 4334
9039 4277
9066 4221
9092 4164
9118 4106
9144 4049
9169 3991
9194 3934
9218 3876
9242 3818
9266 3760
9290 3701
9313 3643
9336 3584
9358 3526
9380 3467
9401 3408
9423 3349
9444 3289
9464 3230
9484 3170
9504 3111
9523 3051
9542 2991
9561 2931
9579 2871
9597 2811
9614 2750
9631 2690
9648 2629
9664 2569
9680 2508
9696 2447
9711 2386
9726 2325
9740 2264
9754 2203
9768 2141
9781 2080
9794 2018
9807 1957
9819 1895
9830 1833
9842 1772
9853 1710
9863 1648
9873 1586
9883 1524
9893 1462
9902 1399
9910 1337
9918 1275
9926 1213
9934 1150
9941 1088
9947 1025
9954 963
9959 900
9965 838
9970 775
9975 712
9979 650
9983 587
9986 524
9989 461
9992 399
9994 336
9996 273
9998 210
9999 147
10000 85
10000 22
10000 -41
9999 -104
9999 -167
9997 -230
9996 -292
9994 -355
9991 -418
9988 -481
9985 -543
9982 -606
9978 -669
9973 -732
9968 -794
9963 -857
9958 -919
9952 -982
9945 -1045
9939 -1107
9931 -1169
9924 -1232
9916 -1294
9908 -1356
9899 -1419
9890 -1481
9880 -1543
9870 -1605
9860 -1667
9849 -1729
9838 -1791
9827 -1852
9815 -1914
9803 -1976
9790 -2037
9777 -2099
9764 -2160
9750 -2222
9736 -2283
9721 -2344
9707 -2405
9691 -2466
9676 -2527
9659 -2587
9643 -2648
9626 -2709
9609 -2769
9591 -2829
9573 -2890
9555 -2950
9536 -3010
9517 -3069
9498 -3129
9478 -3189
9458 -3248
9437 -3308
9416 -3367
9395 -3426
9373 -3485
9351 -3544
9329 -3602
9306 -3661
9283 -3719
9259 -3778
9235 -3836
9211 -3894
9186 -3952
9161 -4009
9136 -4067
9110 -4124
9084 -4181
9058 -4238
9031 -4295
9004 -4352
8976 -4408
8948 -4464
8920 -4521
8891 -4576
8862 -4632
8833 -4688
8803 -4743
8774 -4798
8743 -4854
8713 -4908
8682 -4963
8650 -5017
8618 -5072
8586 -5126
8554 -5180
8521 -5233
8488 -5287
8455 -5340
8421 -5393
8387 -5446
8353 -5498
8318 -5551
8283 -5603
8248 -5655
8212 -5706
8176 -5758
8140 -5809
8103 -5860
8066 -5911
8029 -5962
7991 -6012
7953 -6062
7915 -6112
7876 -6161
7837 -6211
7798 -6260
7759 -6309
7719 -6357
7679 -6406
7638 -6454
7598 -6502
7557 -6549
7515 -6597
7474 -6644
7432 -6691
7390 -6737
7347 -6784
7305 -6830
7261 -6875
7218 -6921
7175 -6966
7131 -7011
7086 -7056
7042 -7100
6997 -7144
6952 -7188
6907 -7232
6861 -7275
6815 -7318
6769 -7360
6723 -7403
6676 -7445
6629 -7487
6582 -7528
6535 -7569
6487 -7610
6439 -7651
6391 -7691
6343 -7731
6294 -7771
6245 -7810
6196 -7849
6146 -7888
6097 -7927
6047 -7965
5996 -8003
5946 -8040
5895 -8077
5845 -8114
5793 -8151
5742 -8187
5691 -8223
5639 -8259
5587 -8294
5535 -8329
5482 -8363
5429 -8398
5377 -8432
5324 -8465
5270 -8499
5217 -8531
5163 -8564
5109 -8596
5055 -8628
5001 -8660
4946 -8691
4891 -8722
4837 -8753
4781 -8783
4726 -8813
4671 -8842
4615 -8871
4559 -8900
4503 -8929
4447 -8957
4391 -8985
4334 -9012
4277 -9039
4221 -9066
4164 -9092
4106 -9118
4049 -9144
3991 -9169
3934 -9194
3876 -9218
3818 -9242
3760 -9266
3701 -9290
3643 -9313
3584 -9336
3526 -9358
3467 -9380
3408 -9401
3349 -9423
3289 -9444
3230 -9464
3170 -9484
3111 -9504
3051 -9523
2991 -9542
2931 -9561
2871 -9579
2811 -9597
2750 -9614
2690 -9631
2629 -9648
2569 -9664
2508 -9680
2447 -9696
2386 -9711
2325 -9726
2264 -9740
2203 -9754
2141 -9768
2080 -9781
2018 -9794
1957 -9807
1895 -9819
1833 -9830
1772 -9842
1710 -9853
1648 -9863
1586 -9873
1524 -9883
1462 -9893
1399 -9902
1337 -9910
1275 -9918
1213 -9926
1150 -9934
1088 -9941
1025 -9947
963 -9954
900 -9959
838 -9965
775 -9970
712 -9975
650 -9979
587 -9983
524 -9986
461 -9989
399 -9992
336 -9994
273 -9996
210 -9998
147 -9999
85 -10000
22 -10000
-41 -10000
-104 -9999
-167 -9999
-230 -9997
-292 -9996
-355 -9994
-418 -9991
-481 -9988
-543 -9985
-606 -9982
-669 -9978
-732 -9973
-794 -9968
-857 -9963
-919 -9958
-982 -9952
-1045 -9945
-1107 -9939
-1169 -9931
-1232 -9924
-1294 -9916
-1356 -9908
-1419 -9899
-1481 -9890
-1543 -9880
-1605 -9870
-1667 -9860
-1729 -9849
-1791 -9838
-1852 -9827
-1914 -9815
-1976 -9803
-2037 -9790
-2099 -9777
-2160 -9764
-2222 -9750
-2283 -9736
-2344 -9721
-2405 -9707
-2466 -9691
-2527 -9676
-2587 -9659
-2648 -9643
-2709 -9626
-2769 -9609
-2829 -9591
-2890 -9573
-2950 -9555
-3010 -9536
-3069 -9517
-3129 -9498
-3189 -9478
-3248 -9458
-3308 -9437
-3367 -9416
-3426 -9395
-3485 -9373
-3544 -9351
-3602 -9329
-3661 -9306
-3719 -9283
-3778 -9259
-3836 -9235
-3894 -9211
-3952 -9186
-4009 -9161
-4067 -9136
-4124 -9110
-4181 -9084
-4238 -9058
-4295 -9031
-4352 -9004
-4408 -8976
-4464 -8948
-4521 -8920
-4576 -8891
-4632 -8862
-4688 -8833
-4743 -8803
-4798 -8774
-4854 -8743
-4908 -8713
-4963 -8682
-5017 -8650
-5072 -8618
-5126 -8586
-5180 -8554
-5233 -8521
-5287 -8488
-5340 -8455
-5393 -8421
-5446 -8387
-5498 -8353
-5551 -8318
-5603 -8283
-5655 -8248
-5706 -8212
-5758 -8176
-5809 -8140
-5860 -8103
-5911 -8066
-5962 -8029
-6012 -7991
-6062 -7953
-6112 -7915
-6161 -7876
-6211 -7837
-6260 -7798
-6309 -7759
-6357 -7719
-6406 -7679
-6454 -7638
-6502 -7598
-6549 -7557
-6597 -7515
-6644 -7474
-6691 -7432
-6737 -7390
-6784 -7347
-6830 -7305
-6875 -7261
-6921 -7218
-6966 -7175
-7011 -7131
-7056 -7086
-7100 -7042
-7144 -6997
-7188 -6952
-7232 -6907
-7275 -6861
-7318 -6815
-7360 -6769
-7403 -6723
-7445 -6676
-7487 -6629
-7528 -6582
-7569 -6535
-7610 -6487
-7651 -6439
-7691 -6391
-7731 -6343
-7771 -6294
-7810 -6245
-7849 -6196
-7888 -6146
-7927 -6097
-7965 -6047
-8003 -5996
-8040 -5946
-8077 -5895
-8114 -5845
-8151 -5793
-8187 -5742
-8223 -5691
-8259 -5639
-8294 -5587
-8329 -5535
-8363 -5482
-8398 -5429
-8432 -5377
-8465 -5324
-8499 -5270
-8531 -5217
-8564 -5163
-8596 -5109
-8628 -5055
-8660 -5001
-8691 -4946
-8722 -4891
-8753 -4837
-8783 -4781
-8813 -4726
-8842 -4671
-8871 -4615
-8900 -4559
-8929 -4503
-8957 -4447
-8985 -4391
-9012 -4334
-9039 -4277
-9066 -4221
-9092 -4164
-9118 -4106
-9144 -4049
-9169 -3991
-9194 -3934
-9218 -3876
-9242 -3818
-9266 -3760
-9290 -3701
-9313 -3643
-9336 -3584
-9358 -3526
-9380 -3467
-9401 -3408
-9423 -3349
-9444 -3289
-9464 -3230
-9484 -3170
-9504 -3111
-9523 -3051
-9542 -2991
-9561 -2931
-9579 -2871
-9597 -2811
-9614 -2750
-9631 -2690
-9648 -2629
-9664 -2569
-9680 -2508
-9696 -2447
-9711 -2386
-9726 -2325
-9740 -2264
-9754 -2203
-9768 -2141
-9781 -2080
-9794 -2018
-9807 -1957
-9819 -1895
-9830 -1833
-9842 -1772
-9853 -1710
-9863 -1648
-9873 -1586
-9883 -1524
-9893 -1462
-9902 -1399
-9910 -1337
-9918 -1275
-9926 -1213
-9934 -1150
-9941 -1088
-9947 -1025
-9954 -963
-9959 -900
-9965 -838
-9970 -775
-9975 -712
-9979 -650
-9983 -587
-9986 -524
-9989 -461
-9992 -399
-9994 -336
-9996 -273
-9998 -210
-9999 -147
-10000 -85
-10000 -22
-10000 41
-9999 104
-9999 167
-9997 230
-9996 292
-9994 355
-9991 418
-9988 481
-9985 543
-9982 606
-9978 669
-9973 732
-9968 794
-9963 857
-9958 919
-9952 982
-9945 1045
-9939 1107
-9931 1169
-9924 1232
-9916 1294
-9908 1356
-9899 1419
-9890 1481
-9880 1543
-9870 1605
-9860 1667
-9849 1729
-9838 1791
-9827 1852
-9815 1914
-9803 1976
-9790 2037
-9777 2099
-9764 2160
-9750 2222
-9736 2283
-9721 2344
-9707 2405
-9691 2466
-9676 2527
-9659 2587
-9643 2648
-9626 2709
-9609 2769
-9591 2829
-9573 2890
-9555 2950
-9536 3010
-9517 3069
-9498 3129
-9478 3189
-9458 3248
-9437 3308
-9416 3367
-9395 3426
-9373 3485
-9351 3544
-9329 3602
-9306 3661
-9283 3719
-9259 3778
-9235 3836
-9211 3894
-9186 3952
-9161 4009
-9136 4067
-9110 4124
-9084 4181
-9058 4238
-9031 4295
-9004 4352
-8976 4408
-8948 4464
-8920 4521
-8891 4576
-8862 4632
-8833 4688
-8803 4743
-8774 4798
-8743 4854
-8713 4908
-8682 4963
-8650 5017
-8618 5072
-8586 5126
-8554 5180
-8521 5233

out

69116

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 1001
struct p{
    double x,y;
}list[maxn],s[maxn];
int n,top;
double m(p p1,p p2,p p0){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
bool cmp(p p1,p p2){
    double t;
    t=m(p1,p2,list[0]);
    if(t>0||(t==0&&pow(p1.x-list[0].x,2)+pow(p1.y-list[0].y,2)<pow(p2.x-list[0].x,2)+pow(p2.y-list[0].y,2)))
        return 1;
    else return 0;
}
void  Graham()
{
    int i;
    sort(list+1,list+n,cmp);
    for(i=0;i<3;i++)s[i]=list[i];
    top=2;
    for(i=3;i<n;i++){
        while(top>0&&(m(list[i],s[top],s[top-1])>=0))top--;
        s[++top]=list[i];
    }
}    
int main()
{
    int i,r,cas;
    p t;
    while(scanf("%d%d",&n,&r)!=EOF)
    {
        
        for(i=0;i<n;i++){
            scanf("%lf%lf",&list[i].x,&list[i].y);
            if((list[i].y<list[0].y)||(list[i].y==list[0].y&&list[i].x<list[0].x)){
                t=list[0];
                list[0]=list[i];
                list[i]=t;
            }
        }
        Graham();
        double ans=0;
        for(i=1;i<=top;i++)
            ans+=sqrt((s[i-1].x-s[i].x)*(s[i-1].x-s[i].x)+(s[i-1].y-s[i].y)*(s[i-1].y-s[i].y));
        ans+=sqrt((s[i-1].x-s[0].x)*(s[i-1].x-s[0].x)+(s[i-1].y-s[0].y)*(s[i-1].y-s[0].y));
        printf("%d\n",int(ans+2*r*3.141592653589+0.5));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zxj015/p/2740282.html