连接:http://codeforces.com/contest/800
二分
边界不会求,试了几次-_-||
1 #include<cstdio> 2 #include<cstring> 3 const int maxn=100010; 4 double a[maxn],b[maxn]; 5 int n; 6 double p; 7 bool check(double m) 8 { 9 double ans=0; 10 for(int i=0;i<n;i++) 11 { 12 double temp=a[i]*m-b[i]; 13 if(temp>1e-5) ans+=temp/p; 14 15 } 16 return (m-ans)>1e-5; 17 } 18 int main() 19 { 20 double re=0; 21 scanf("%d%lf",&n,&p); 22 for(int i=0;i<n;i++) 23 { 24 scanf("%lf%lf",&a[i],&b[i]); 25 re+=a[i]; 26 } 27 if(re<=p) {puts("-1");return 0;} 28 double l=0.0,r=0x3f3f3f3f3f3f; //据说r=1e10 29 while((r-l)>1e-6) 30 { 31 32 double m=(l+r)/2.0; 33 if(check(m)) l=m; 34 else r=m; 35 } 36 37 printf("%.4lf ",l); 38 return 0; 39 40 }
凸多边形->凹多边形
也不会,几何这方面很少做题。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 struct node 7 { 8 double x,y; 9 }p[2000]; 10 node sub(node i,node j) 11 { 12 return node{i.x-j.x,i.y-j.y}; 13 } 14 double mul(node i,node j) 15 { 16 return i.x*j.y-i.y*j.x; 17 } 18 19 double getdis(node i,node j) 20 { 21 return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y)); 22 } 23 24 int main() 25 { 26 int n; 27 scanf("%d",&n); 28 for(int i=0;i<n;i++) 29 scanf("%lf%lf",&p[i].x,&p[i].y); 30 double ans=0x3f3f3f3f; 31 for(int i=0;i<n;i++) 32 { 33 double area=mul(sub(p[(i+2)%n],p[i]),sub(p[(i+1)%n],p[i]))/2.0; 34 ans=min(ans,area/getdis(p[i],p[(i+2)%n])); 35 36 } 37 printf("%.7lf",ans); 38 }
剩下的以后再补吧,,现在看有点吃力。。。