CF800

连接:http://codeforces.com/contest/800

A:Voltage Keepsake

二分

边界不会求,试了几次-_-||

 1 #include
 2 #include
 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)
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)
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\n",l);
38         return 0;
39 
40 }
View Code

B:Volatile Kite

凸多边形->凹多边形

也不会,几何这方面很少做题。

 1 #include
 2 #include
 3 #include
 4 #include
 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)
29         scanf("%lf%lf",&p[i].x,&p[i].y);
30     double ans=0x3f3f3f3f;
31     for(int i=0;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 }
View Code

 

剩下的以后再补吧,,现在看有点吃力。。。

 

转载于:https://www.cnblogs.com/yijiull/p/6793368.html

你可能感兴趣的:(CF800)