[CodeForces-606E] Freelancer's Dreams 凸包 模型转换

  大致题意:

    有一个人想要获得p个经验点和q元钱。现在给出n份工作,每份工作每天能得到Ai的经验值和Bi的钱,问最少需要工作多少天,

    能使得总经验值>=p,总钱>=q。

  

    先对给出的n份工作以及原点O(0,0),x轴的最大点(maxx,0),y轴最大点(0,maxy)构建凸包,根据凸组合,可知凸包上所有得点以

    及凸包边上的点都可以由一天时间得到,那么只要求出射线O~P(p,q)与凸包的交点,即可求出最后的结果。

    

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<set>
  7 #include<map>
  8 #include<stack>
  9 #include<time.h>
 10 #include<cstdlib>
 11 #include<cmath>
 12 #include<list>
 13 using namespace std;
 14 #define MAXN 200100
 15 #define eps 1e-5
 16 #define For(i,a,b) for(int i=a;i<=b;i++)
 17 #define Fore(i,a,b) for(int i=a;i>=b;i--)
 18 #define lson l,mid,rt<<1
 19 #define rson mid+1,r,rt<<1|1
 20 #define mkp make_pair
 21 #define pb push_back
 22 #define cr clear()
 23 #define sz size()
 24 #define met(a,b) memset(a,b,sizeof(a))
 25 #define iossy ios::sync_with_stdio(false)
 26 #define fre freopen
 27 #define pi acos(-1.0)
 28 #define inf 1e9+9
 29 #define Vector Point
 30 const int Mod=1e9+7;
 31 typedef unsigned long long ull;
 32 typedef long long ll;
 33 typedef pair<int,int> pii;
 34 typedef pair<ll,ll> pll;
 35 int dcmp(double x){
 36     if(fabs(x)<=eps) return 0;
 37     return x<0?-1:1;
 38 }
 39 struct Point {
 40     double x,y;
 41     int id;
 42     int pre,nxt;
 43     Point(double x=0,double y=0) : x(x),y(y) {}
 44     Point operator - (const Point &a)const{ return Point(x-a.x,y-a.y); }
 45     Point operator + (const Point &a)const{ return Point(x+a.x,y+a.y); }
 46     Point operator * (const double &a)const{ return Point(x*a,y*a); }
 47     Point operator / (const double &a)const{ return Point(x/a,y/a); }
 48     bool operator < (const Point &a)const{    if(x==a.x) return y<a.y;return x<a.x; }
 49     bool operator == (const Point &a)const{ return dcmp(x-a.x)==0 && dcmp(y-a.y)==0; }
 50     void read(int iid=0) { scanf("%lf%lf",&x,&y);id=iid; }
 51     void out(){cout<<"Bug: "<<x<<" "<<y<<endl;}
 52 };
 53 inline double Cross(Vector a,Vector b) { return a.x*b.y-a.y*b.x; }
 54 inline double Dot(Vector a,Vector b) { return a.x*b.x+a.y*b.y; }
 55 inline double dis(Vector a) { return sqrt(Dot(a,a)); }
 56 int ConvexHull(Point *p,int n,Point *ch){
 57     int m=0;
 58     sort(p,p+n);
 59     For(i,0,n-1){
 60         p[i].id=i;
 61         while(m>1 && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
 62         ch[m++]=p[i];
 63     }
 64     int k=m;
 65     Fore(i,n-2,0){
 66         while(m>k && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
 67         ch[m++]=p[i];
 68     }
 69     if(n>1) m--;
 70     return m;
 71 }
 72 inline bool Onsegment(Point a,Point b1,Point b2){
 73     return dcmp(Cross(b1-a,b2-a))==0 && dcmp(Dot(b1-a,b2-a))<0;
 74 }
 75 bool Intersect_Segm_Ray(Point a1,Vector u,Point b1,Point b2){
 76     double c1=Cross(b1-a1,u),c2=Cross(b2-a1,u);
 77     if(dcmp(c2)*dcmp(c1)>0) return 0;
 78     if(dcmp(c2)*dcmp(c1)<0){
 79         c1=Dot(b1-a1,u);c2=Dot(b2-a1,u);
 80         return dcmp(c1)>=0 && dcmp(c2)>=0;
 81     }
 82     if(c1==0) return dcmp(Dot(b1-a1,u))>0;
 83     if(c2==0) return dcmp(Dot(b2-a1,u))>0;
 84 }
 85 Point Intersect_Line_Point(Point p,Vector u,Point q,Vector v){
 86     Vector w=p-q;
 87     double t=Cross(v,w)/Cross(u,v);
 88     return p+u*t;
 89 }
 90 int n;
 91 double maxx,maxy;
 92 Point p[MAXN],cp;
 93 Point ch[MAXN];
 94 int solve(){
 95     double ans=inf;maxx=0;maxy=0;
 96     cin>>n;cp.read();
 97     For(i,0,n-1) p[i].read(),maxx=max(p[i].x,maxx),maxy=max(p[i].y,maxy);
 98     p[n]=Point(0,0);
 99     p[n+1]=Point(0,maxy);
100     p[n+2]=Point(maxx,0);
101     int m=ConvexHull(p,n+3,ch);
102     For(i,0,m-1){
103         if(ch[i]==Point(0,0) || ch[(i+1)%m]==Point(0,0)) continue;
104         if(Intersect_Segm_Ray(Point(0,0),cp,ch[(i+1)%m],ch[i])){
105             Point st=Intersect_Line_Point(cp,cp,ch[i],ch[(i+1)%m]-ch[i]);
106             ans=min(ans,dis(cp)/dis(st));
107         }
108     }
109     printf("%.15lf\n",ans);
110 }
111 int main(){
112 //  fre("in.txt","r",stdin);
113     int t=1;
114     while(t--)solve();
115     return 0;
116 }

     

[CodeForces-606E] Freelancer's Dreams 凸包 模型转换

原文地址:https://www.cnblogs.com/cjbiantai/p/9370155.html

时间: 2024-09-28 23:02:28

[CodeForces-606E] Freelancer's Dreams 凸包 模型转换的相关文章

Codeforces 605C Freelancer&#39;s Dreams 凸包

Freelancer's Dreams 我们把每个二元组看成是平面上的一个点, 那么两个点的线性组合是两点之间的连线, 即x * (a1, b1) + y * (a1, b1) && x + y == 1, 那么n个点的线性组合就是一个凸包, 那么我们求出凸包和(0, 0)到(p, q)直线的交的那个较大值就是最优的组合平均速度. 需要注意的是, 直线和凸包可能没有交点, 需要加入(maxa, 0), (0, maxb)这两个点. #include<bits/stdc++.h>

Codeforces Round #335 (Div. 1)--C. Freelancer&#39;s Dreams 线性规划对偶问题+三分

题意:p, q,都是整数. sigma(Ai * ki)>= p, sigma(Bi * ki) >= q; ans = sigma(ki).输出ans的最小值 约束条件2个,但是变量k有100000个,所以可以利用对偶性转化为求解 ans = p * y1 + q * y2 约束条件为: Ai * y1 + Bi * y2 <= 1 其中i为0~n-1 也就是n个约束条件. 后面三分搞搞就好了 1 #include <bits/stdc++.h> 2 using names

codeforce 605BE. Freelancer&#39;s Dreams

题意:给你n个工程,做了每个工程相应增长x经验和y钱.问你最少需要多少天到达制定目标.时间可以是浮点数. 思路:杜教思路,用对偶原理很简易.个人建议还是标准解题法,凸包+线性组合. 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include&

Codeforces 50C Happy Farm 5 凸包

题目链接:点击打开链接 == 难得的y出了一道计算几何.. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> using namespace std; #define INF 999999999.9 #define PI acos(-1.0) #define ll long long struct Poi

数据库设计之E-R模型转换成关系模型

个人重构版机房收费系统中需要自己重新设计数据库,那么如何设计数据库呢?这也是咱们自考中一门重要的课程<数据库原理>,对于考过这科的同学想必已经从中受益,直接就可以学以致用.我是今年10月份考这本书,所以就先实践一把. 原先看过的耿建玲老师的视频,里面重点讲解的是数据库内部的具体操作,没有怎么涉及到数据库设计中不可或缺的一个步骤即从概念模型到逻辑模型的转换.进入正题: 背景:数据系统生存期 我们把数据库应用系统从开始规划.设计.实现.维护到最后被新的系统取代而停止使用的整个期间,称为数据库系统生

OpenVino的MXnet模型转换

[在使用Movidius的模型优化器转换模型之前,需要先用MXNet的deploy.py将模型转换成部署模式,然后才能用movidius的优化器转换] https://github.com/apache/incubator-mxnet/blob/master/example/ssd/deploy.py cd ~git clone https://github.com/apache/incubator-mxnet mv tmp/*-0000.params tmp/ssd_resnet50_512-

Mxnet模型转换ONNX,再用tensorrt执行前向运算

环境:ubuntu16.04 tensorrt版本:5.1.5.0 cuda版本:9.0 GPU:1080Ti Mxnet版本:1.3.1 cudnn:7.3.1 1.tensorrt安装: https://github.com/NVIDIA/TensorRT tensorrt的不同版本: https://developer.nvidia.com/nvidia-tensorrt-download tensorrt python版的安装参考: https://blog.csdn.net/zong5

动态规划(模型转换):uvaoj 1625 Color Length

[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=5010; 6 char s1[maxn],s2[maxn]; 7 int B1[26],E1[

Flutter JSON解析与复杂模型转换技巧

其实转换成model类是有好处的,转换后可以减少上线后APP崩溃和出现异常,所以我们从这节课开始,要制作model类模型,然后用model的形式编辑UI界面. 类别json的分析 比如现在从后台得到了一串JSON数据: { "code": "0", "message": "success", "data": [{ "mallCategoryId": "4", &quo