数据范围给的很小啊,n >= 0 && n <= 7,所以给了DFS生存的空间。
对于每一个油滴,可以说在它下一个油滴放置之前,当前的这个油滴的半径并不确定(但是对于边界情况是可以判断的)。
当把下一个油滴滴入时,当前油滴的半径就已经确定了(如果这个油滴滴在上一个油滴的范围内,就直接return 0,避免冗余计算)。
注意:在DFS中每次的r[j]和v[j]都要重置为0(血的教训)。
CODE:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <cctype> 7 #include <queue> 8 #include <cmath> 9 #define zxy(i,a,b) for(int i = a ; i <= b ; i++) 10 #define zxyzxy(i,a,b) for(int i = a ; i < b ; i++) 11 #define yxz(i,a,b) for(int i = a ; i >= b ; i--) 12 #define yxzyxz(i,a,b) for(int i = a ; i > b ; i--) 13 #define gameover printf(" ") 14 #define N 1000005 15 #define mod 100003 16 #define INF 0x7fffffff 17 #define PI 3.14159265358979323846 18 #define y1 y111111111111 19 #define bin return 20 typedef long long ll; 21 typedef double db; 22 typedef float fl; 23 typedef char cr; 24 using namespace std; 25 int read() 26 { 27 int x = 0,t = 1; 28 char c = getchar(); 29 while((c > '9' || c < '0') && c != '-') 30 c = getchar(); 31 if(c == '-') 32 t = -1,c = getchar(); 33 while(c >= '0' && c <= '9') 34 x = x * 10 + c - 48,c = getchar(); 35 bin x * t; 36 } 37 38 void write(ll x) 39 { 40 if(x < 0) 41 x = -x,putchar('-'); 42 if(x >= 10) 43 write(x / 10); 44 putchar(x % 10 + '0'); 45 } 46 47 int n; 48 int x2,y2,x1,y1; 49 int x[N],y[N]; 50 int v[N]; 51 db o = -1,r[N]; 52 int quick_pow(int a,int b) 53 { 54 int base = a,ans = 1; 55 while(b) 56 { 57 if(b & 1) 58 ans = ans * base; 59 base = base * base; 60 b>>=1; 61 } 62 bin ans; 63 } 64 65 66 db mymin(db a,db b) 67 { 68 if(a > b) 69 return b; 70 bin a; 71 } 72 73 db mymax(db a,db b) 74 { 75 if(a > b) 76 return a; 77 bin b; 78 } 79 80 db dis(int xx,int yy,int xxx,int yyy) 81 { 82 bin sqrt(quick_pow((abs(xx - xxx)),2) + quick_pow((abs(yy - yyy)),2)); 83 } 84 85 db work(int i) 86 { 87 zxy(j,1,n) 88 if(j != i && v[j]) 89 if(r[j] > dis(x[j],y[j],x[i],y[i])) 90 return 0; 91 db lr = min(abs(x[i] - x2),abs(x[i] - x1)); 92 db hb = min(abs(y[i] - y2),abs(y[i] - y1)); 93 db ans = mymin(lr,hb); 94 db distance; 95 zxy(j,1,n) 96 if(j != i && v[j]) 97 { 98 distance = dis(x[j],y[j],x[i],y[i]) - r[j]; 99 ans = min(ans,distance); 100 } 101 bin ans; 102 } 103 104 void DFS(int i,db step) 105 { 106 if(i > n) 107 { 108 o = mymax(o,step); 109 bin; 110 } 111 112 zxy(j,1,n) 113 { 114 if(!r[j]) 115 { 116 r[j] = work(j); 117 v[j] = 1; 118 DFS(i + 1,step + PI * r[j] * r[j]); 119 v[j] = 0; 120 r[j] = 0; 121 } 122 } 123 } 124 125 int main() 126 { 127 n = read(); 128 x2 = read(),y2 = read(),x1 = read(),y1 = read(); 129 db s = abs(x2 - x1) * abs(y2 - y1); 130 zxy(i,1,n) 131 x[i] = read(),y[i] = read(); 132 DFS(1,0); 133 // cout<<o<<endl; 134 printf("%.0lf ",s - o); 135 gameover; 136 bin 0; 137 } 138 /* 139 3 140 -98 5 30 30 141 -42 11 142 -51 17 143 -11 22 144 */