Luogu P1381油滴扩展

传送门

 

数据范围给的很小啊,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("\n")
 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\n",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 */

 

posted @ 2018-10-17 10:12  Zhoier  阅读(165)  评论(0编辑  收藏  举报