【BZOJ】【1027】【JSOI2007】合金
计算几何/凸包/Floyd
Orz rausen大爷太强辣
计算几何题目果然不会做>_>
这个题……虽然他给了3个坐标,但实际上是个二维的计算几何题= =因为第三维坐标可以直接用前两维坐标表示出来。
考虑一下这些二维平面上的点的意义……
假如我们现在手里有一种原材料$(x_1,y_1)$,那么我们就只能搞出这一种合金= =
那么如果有两种原材料,我们配一配,就可以配出$(x_1,y_1)$到$(x_2,y_2)$这条线段上的所有合金= =
如果有三种,我们能配出的就是那个三角形区域的所有种类的合金……
以此类推……我们有n种原材料,我们能搞出的合金就是这n个点的凸包围出来的区域。
所以问题就变成了:从n个点中选出最少的p个点使得给定的m个点全部在这p个点的凸包内(主要意思是这样,当然还有一些边界情况,嗯就是共线、共点……)
这个是用floyd求最小环来做的……对于每对点(i,j),如果m个点都在向量(i->j)的左边,则连边 i->j 权值为1,那么$ans=min\{dist[i][i]\}$
P.S.好像没有用到求凸包的算法……不过用了凸包的思想……
/**************************************************************
Problem: 1027
User: Tunix
Language: C++
Result: Accepted
Time:1172 ms
Memory:2288 kb
****************************************************************/ //BZOJ 1027
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-')r=-;
for(; isdigit(ch);ch=getchar()) v=v*+ch-'';
return r*v;
}
typedef double lf;
const lf eps=1e-;
const int N=,INF=1e9;
/*******************template********************/
int n,m,d[N][N];
struct Point{
double x,y;
Point(){}
Point(lf x,lf y):x(x),y(y){}
void read(){scanf("%lf%lf%*lf",&x,&y);}
inline bool operator != (const Point &p)const{
return fabs(x-p.x) > eps || fabs(y-p.y) > eps;
}
}a[N],b[N];
typedef Point Vector;
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
lf Cross(Point a,Point b){return a.x*b.y-a.y*b.x;} bool in_one_line(Point x,Point y){
if (x.x > y.x) swap(x,y);
F(i,,m) if (b[i].x < x.x || b[i].x > y.x) return ;
if (x.y > y.y) swap(x,y);
F(i,,m) if (b[i].y < x.y || b[i].y > y.y) return ;
return ;
}
int check(Point x,Point y){
int cnt1=,cnt2=; lf tmp;
F(i,,m){
tmp=Cross(y-x,b[i]-x);
if (tmp>eps) ++cnt1;
if (tmp<-eps) ++cnt2;
if (cnt1 && cnt2) return ;
}
if (!cnt1 && !cnt2 && in_one_line(x,y)){
puts("");
return -;
}
return cnt1 ? : cnt2 ? : ;
}
void Floyd(){
int ans=INF;
F(k,,n) F(i,,n) F(j,,n)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
F(i,,n) ans=min(ans,d[i][i]);
if (ans==INF || ans<=) puts("-1");
else printf("%d\n",ans);
}
void solve(){
F(i,,n) F(j,,n) d[i][j]=INF;
F(i,,n) F(j,i+,n){
int f=check(a[i],a[j]);
if (f==-) return;
if (f==) d[i][j]=;
else if (f==) d[j][i]=;
else if (f==) d[i][j]=d[j][i]=;
}
Floyd();
}
bool spj(){
F(i,,n) if (a[]!=a[i]) return ;
F(i,,m) if (a[]!=b[i]) return ;
puts("");
return ;
}
int main(){
n=getint(); m=getint();
F(i,,n) a[i].read();
F(i,,m) b[i].read();
if (spj()) return ;
solve();
return ;
}
1027: [JSOI2007]合金
Time Limit: 4 Sec Memory Limit: 162 MB
Submit: 2423 Solved: 635
[Submit][Status][Discuss]
Description
某
公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同。然后,将每种原材料取出一
定量,经过融解、混合,得到新的合金。新的合金的铁铝锡比重为用户所需要的比重。
现在,用户给出了n种他们需要的合金,以及每种合金中铁铝锡的比重。公司希望能够订购最少种类的原材料,并且使用这些原材料可以加工出用户需要的所有种类
的合金。
Input
第
一行两个整数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),分别表示铁铝锡在一种用户需要的合金中所占的比重。
Output
一个整数,表示最少需要的原材料种数。若无解,则输出–1。
Sample Input
0.1 0.2 0.7
0.2 0.3 0.5
0.3 0.4 0.3
0.4 0.5 0.1
0.5 0.1 0.4
0.6 0.2 0.2
0.7 0.3 0
0.8 0.1 0.1
0.9 0.1 0
1 0 0
0.1 0.2 0.7
0.2 0.3 0.5
0.3 0.4 0.3
0.4 0.5 0.1
0.5 0.1 0.4
0.6 0.2 0.2
0.7 0.3 0
0.8 0.1 0.1
0.9 0.1 0
1 0 0
Sample Output
HINT
Source
【BZOJ】【1027】【JSOI2007】合金的更多相关文章
- 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个材料合金能否合成一个需求合金的时候 ...
- BZOJ 1027 JSOI2007 合金 计算几何+Floyd
题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所 ...
- BZOJ 1027 [JSOI2007]合金 ——计算几何
我们可以把每一种金属拆成一个二维向量,显然第三维可以计算出来,是无关的. 我们只需要考虑前两维的情况,显然可以构成点集所形成的凸包内. 然后我们枚举两两的情况,然后可以发现如果所有的点都在一侧是可以选 ...
- bzoj 1027: [JSOI2007]合金【凸包+Floyd】
参考:https://www.cnblogs.com/zhuohan123/p/3237246.html 因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点.首先考虑一个客户需求能 ...
- BZOJ 1027: [JSOI2007]合金 (计算几何+Floyd求最小环)
题解就看这位仁兄的吧-不过代码还是别看他的了- 同样的方法-我200ms,他2000ms. 常数的幽怨- CODE #include <bits/stdc++.h> using names ...
- 【BZOJ】1027: [JSOI2007]合金(凸包+floyd)
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 题意:$n$种材料,$m$种需求.每种材料有三个属性,给出三个属性的含量(和为1),问能否通过 ...
- 1027: [JSOI2007]合金 - BZOJ
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的 ...
- bzoj千题计划123:bzoj1027: [JSOI2007]合金
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 因为x+y+z=1,所以z=1-x-y 第三维可以忽略 将x,y 看做 平面上的点 简化问题: ...
随机推荐
- app.config *.exe.config 和*.vshost.exe.config基础学习
一.问题描述 在使用config文件来保存一些参数,便于下次启动程序时自动加载上次设置的参数的功能时, 碰到个问题,vs2010下调试运行程序始终无法实现config记录上次参数值,而直接运行exe程 ...
- kettle的hello world
本篇介绍使用kettle的一个最简单的例子,可以初步了解下转换. 需求是这样的: 存在一个本地csv文件,文件的内容如下 现在需要将csv中的数据保存到本地的文本文件中 1.创建一个转换,并且重命名 ...
- sublime几个有用的快捷键
几个有用的快捷键:Ctrl+D:选择多个相同字符串进行修改.选中字符串,按住Ctrl+D,继续选中下一个.Ctrl+Shift+L:将选中的内容切割成多行,然后每一行可以同时编辑Ctrl+J:将已选择 ...
- BufferedInputSream和BufferedOutputSream,,,
package cd.itcast.bufferinputstream; import java.io.BufferedInputStream; import java.io.File; import ...
- 第一节:CLR寄宿
本系列文章来自 CLR VIA C# .NET FrameWork在Microsoft Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和 ...
- 19.python的编码问题
在正式说明之前,先给大家一个参考资料:戳这里 文章的内容参考了这篇资料,并加以总结,为了避免我总结的不够完善,或者说出现什么错误的地方,有疑问的地方大家可以看看上面那篇文章. 以下说明是针对于pyth ...
- CMD怎样建立文件?
一.建立空文件的几种方法1.cd.>a.txtcd.表示改变当前目录为当前目录,即等于没改变:而且此命令不会有输出.>表示把命令输出写入到文件.后面跟着a.txt,就表示写入到a.txt. ...
- Github上LeakCanary编译报错CreateProcess error=2的解决方法
现象说明: 从github上拉下LeakCanary编译时报错 CreateProcess error=2, ϵͳÕҲ»µ½ָ¶ 原因分析: 该现象是由于Windows中Gradle调用命令未加cmd ...
- oracle 表迁移方法 (二) 约束不失效
DB:11.2.0.3.0 在oracle 表迁移方法 (一)中,只是move了一张普通的表,如果表的字段带有主键约束呢 ? [oracle@db01 ~]$ sqlplus / as sysdba ...
- Android--调用系统的DownLoadManager去下载文件
代码里面有详细的注释: /** * 该方法是调用了系统的下载管理器 */ public void downLoadApk(Context context,String url){ /** * 在这里返 ...