bzoj1027【JSOI2007】合金
题目描述
某公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料,不同种类的
原材料中铁铝锡的比重不同。然后,将每种原材料取出一定量,经过融解、混合,得到新的合金。新的合金的铁铝
锡比重为用户所需要的比重。 现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重。公司希望能
够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类的合金。
输入格式
第一行两个整数m和n(m, n ≤ 500),分别表示原材料种数和用户需要的合金种数。第2到m + 1行,每行三
个实数a, b, c(a, b, c ≥ 0 且 a + b + c = 1),分别表示铁铝锡在一种原材料中所占的比重。第m + 2到m +
n + 1行,每行三个实数a, b, c(a, b, c ≥ 0 且 a + b + c = 1),分别表示铁铝锡在一种用户需要的合金中
所占的比重。
输出格式
一个整数,表示最少需要的原材料种数。若无解,则输出–1。
题解
- $a+b+c=1$所以忽略$c$,根据定比分点原则两个点可以表示的点组成它们连线段,推广一下;
- 所以对$n$个点求出凸包,问题即用$m$个点去圈住凸包求最小点数;
- 对两个材料$i,j$,如果凸包上的点都在连线$\vec{ij}$的左边就$i$向$j$连边,$floyd$求所有$dis[i][i]$即可;
- 特判:
- 当凸包是一个点时特判;
- 当凸包是一条直线时,如果叉积为$0$还需要盖住所有点才可以加边,用点积特判;
- #include<bits/stdc++.h>
- #define db double
- #define inf 0x3f3f3f3f
- #define il inline
- #define eps 1e-7
- using namespace std;
- const int N=;
- int n,m,top,dis[N][N];
- il int dcmp(db x){return fabs(x)<eps?:x<?-:;}
- struct poi{
- db x,y;
- poi(db _x=,db _y=):x(_x),y(_y){};
- il poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
- il bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
- }p1[N],p2[N],q[N];
- il db crs(poi A,poi B){return A.x*B.y-A.y*B.x;}
- il db dot(poi A,poi B){return A.x*B.x+A.y*B.y;}
- il bool spj(){
- int fg=;
- for(int i=;i<=n;++i)if(dcmp(p1[].x-p1[i].x)||dcmp(p1[].y-p1[i].y)){fg=;break;}
- for(int i=;i<=m;++i)if(dcmp(p1[].x-p2[i].x)||dcmp(p1[].y-p2[i].y)){fg=;break;}
- if(!fg){puts("");return true;}
- else return false;
- }
- il void convex(){
- sort(p2+,p2+m+);
- q[top=]=p2[];
- if(m==)return;
- for(int i=;i<=m;++i){
- while(top>&&dcmp(crs(q[top]-q[top-],p2[i]-q[top]))<=)top--;
- q[++top]=p2[i];
- }
- int now=top;
- for(int i=m-;i;--i){
- while(top>now&&dcmp(crs(q[top]-q[top-],p2[i]-q[top]))<=)top--;
- q[++top]=p2[i];
- }
- top--;
- }
- il bool judge(int a,int b){
- int i; poi p = p1[b]-p1[a];
- for(i=;i<=top;++i){
- int c = dcmp(crs(p, q[i]-p1[a]));
- if(c>)break;
- if(!c&&dcmp(dot(q[i]-p1[b], q[i]-p1[a]))>)break;
- }
- return i==top+?true:false;
- }
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("bzoj1027.in","r",stdin);
- freopen("bzoj1027.out","w",stdout);
- #endif
- db tmp;
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;++i)scanf("%lf%lf%lf",&p1[i].x,&p1[i].y,&tmp);
- for(int i=;i<=m;++i)scanf("%lf%lf%lf",&p2[i].x,&p2[i].y,&tmp);
- if(spj())return ;
- convex();
- memset(dis,0x3f,sizeof(dis));
- for(int i=;i<=n;++i)
- for(int j=;j<=n;++j)if(i!=j){
- if(judge(i,j))dis[i][j]=;
- }
- for(int k=;k<=n;++k)
- for(int i=;i<=n;++i)
- for(int j=;j<=n;++j){
- if(dis[i][j]>dis[i][k]+dis[k][j])
- dis[i][j] = dis[i][k]+dis[k][j];
- }
- int ans=inf;
- for(int i=;i<=n;++i)ans = min(ans, dis[i][i]);
- if(ans==inf)puts("-1"); else printf("%d\n",ans);
- return ;
- }
bzoj1027
- #include<bits/stdc++.h>
bzoj1027【JSOI2007】合金的更多相关文章
- bzoj1027 [JSOI2007]合金
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2671 Solved: 703[Submit][Status][ ...
- bzoj千题计划123:bzoj1027: [JSOI2007]合金
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 因为x+y+z=1,所以z=1-x-y 第三维可以忽略 将x,y 看做 平面上的点 简化问题: ...
- BZOJ1027 [JSOI2007]合金 【计算几何 + floyd】
题目 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金的 ...
- 【bzoj1027】合金
[bzoj1027]合金 分析 数形结合+计算几何+Floyd最小环. http://blog.csdn.net/popoqqq/article/details/40539273 虽然这样占大家的很不 ...
- bzoj 1027 [JSOI2007]合金(计算几何+floyd最小环)
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2970 Solved: 787[Submit][Status][ ...
- BZOJ 1027 [JSOI2007]合金
1027: [JSOI2007]合金 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2605 Solved: 692[Submit][Status][ ...
- [bzoj 1027][JSOI2007]合金(解析几何+最小环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1027 分析: 首先因为一个合金的和为1,所以考虑2个材料合金能否合成一个需求合金的时候 ...
- 1027: [JSOI2007]合金 - BZOJ
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的 ...
- [JSOI2007]合金
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新 ...
- P4049 [JSOI2007]合金
传送门 我数学可能白学了-- 因为三个数加起来等于\(1\),那么只要用前两个数就能表示,那么就能把每一种金属看成一个二维向量.考虑只有两个向量的时候,设这两个向量为\(a,b\),那么一个向量\(c ...
随机推荐
- MariaDB远程连接问题
MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...
- Centos7 Jenkins
代码上线 持续集成 随时随地将代码合并,这种方法叫做持续集成. 持续集成(CONTINUOUS INTEGRATION,简称CI)持续集成指的是,频繁地(一天多次)将代码集成到主干.它的好处主要有两个 ...
- Homebrew -- 安装与使用
使用 React Native,必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 推荐使用Homebrew来安装 Node 和 Watchman ...
- oracle删除死锁进程
在命令行下运行: select SID,SERIAL# from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID; alte ...
- ffmpeg——压缩mav格式音频
今天偶然帮朋友压缩一个mav格式的音频.开始用压缩码率的方式,mav格式的音频体积一点都没变,查资料需要压缩音频文件的采样率和声道才能压缩mav格式的音频. 压缩要求是:将一个mav格式的音频文件,由 ...
- mybatis oracle和mysql like模糊查询写法
oracle:RESOURCE_NAME LIKE '%' || #{resourceName} || '%'mysql:RESOURCE_NAME like concat(concat(" ...
- 计算器简单封装和ASP.net
封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- 利用python进行简单的图像处理:包括打开,显示以及保存图像
利用python进行简单的图像处理:包括打开,显示以及保存图像 利用PIL处理 PIL(python image library) 是python用于图片处理的package.但目前这个package ...
- HDU 4336 Card Collector 期望dp+状压
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Time Limit: 2000/1000 MS (Java/O ...
- BETA-2
前言 我们居然又冲刺了·二 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 了解OpenCV下的视频参数及其调用方法 初步编码 接下来的计划 文档工作 速 ...