【BZOJ 1027】[JSOI2007]合金
【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1027
【题意】
【题解】
因为和为1;
所以只要知道两个属性第三个属性就能用1减出来了;
然后把每个合金材料化为平面坐标上的二维坐标;
两个合金能够合成的新合金的坐标就在这两个合金的连线上。
你可以假设两个合金的量分别为a,b;
对于某一种物质
新的合金该物质的含量为
(ap1+bp2)/(a+b)
=q*p1+w*p2;
这里(q+w)=1
然后代入两点式可证新的点必然在其上.
所以两个合金能够合成的新的合金必然在它们的连线上.
然后有多个合金。
要求你把这些合金合成客户所需要的合金。
可以想象成两个点集S1和S2
要在S1中选择最少的点集;
使得这些点集形成的闭包包围住了整个S2;
(可以证明只要闭包包住了S2,则S2里面的点集都能得到);
然后用计算几何搞出来S1中任意两个点(i,j)是否S2整个在其左侧.
如果是的话在(i,j)之间连一条边,边权为1;
然后求最小环就是答案了;
这里get到了求最小环的新姿势。
然后这个程序漏了两种情况;
就是ans=1和ans=2的情况。
对于这两种情况是要特判的;
因为这两种情况不是一个闭包了(对应了一个点和一条线)
没办法用闭包涉及到。
所以要加上一个点和两个点的特判;
(很懒并没有加上)
数据很弱啊,不想加了。知道就好。
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 510;
const int INF = 0x3f3f3f3f;
struct point
{
double x, y;
point operator -(const point z)
{
point re;
re.x = x - z.x;
re.y = y - z.y;
return re;
}
double operator * (const point z)
{
return x*z.y - y*z.x;
}
double operator ^ (const point z)
{
return x*z.x + y*z.y;
}
} a[N], b[N];
int m, n;
int d[N][N], f[N][N];
int ans = INF;
void input_data()
{
rei(m), rei(n);
double t;
rep1(i, 1, m)
{
ref(a[i].x), ref(a[i].y), ref(t);
}
rep1(i, 1, n)
{
ref(b[i].x), ref(b[i].y), ref(t);
}
}
void ga()
{
memset(d, 0x3f, sizeof d);
rep1(i,1,m)
rep1(j, 1, m)
{
int k;
for (k = 1; k <= n;k++)
{
double cross = (a[i] - b[k])*(a[j] - b[k]);
if (cross > 1e-7)
break;
if (fabs(cross) < 1e-7 && (a[i] - b[k] ^ a[j] - b[k]) > 1e-7)
break;
}
if (k == n + 1)
d[i][j] = 1;
}
}
void fl()
{
memcpy(f, d, sizeof f);
rep1(k,1,m)
rep1(i,1,m)
if (f[i][k]<INF)
rep1(j, 1, m)
{
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
rep1(i, 1, m)
ans = min(ans, f[i][i]);
}
void o()
{
if (ans == INF)
{
puts("-1");
return;
}
printf("%d\n", ans);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
ga();
fl();
o();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【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 看做 平面上的点 简化问题: ...
随机推荐
- php高并发秒杀解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/super_runman/article/details/53037151 在秒杀.抢火车票等地方,我 ...
- shell学习四十天----awk的惊人表现
awk的惊人表现 awk能够胜任差点儿全部的文本处理工作. awk 调用 1.调用awk: 方式一:命令行方式 awk [-F field-separator ] 'commands' inp ...
- Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)
题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下 ...
- Android 使用JSON格式与服务器交互 中文乱码问题解决
当前是在开发Android 程序时,客户端与服务器端采用JSON传送数据,发现中文乱码问题.不过这个问题的解决办法应该对所有java语言开发的项目都使用. 解决方法是: 1.客户端发送数据之间加上: ...
- 关于python的二维数组
test =[ [1, 2, 3], [4, 5, 6], [7, 8, 9]] #这个就可以看做是二维数组了,直接创建print(test)print(test[:][1]) ...
- HDU 1556 Color the ball【算法的优化】
/* 解题思路:每次仅仅求解一開始的第一个数字,让第一个数字加一,最后的一个数字的后面一个数减一.我们能够想想,最后加的时候,就是加上前面一个数出现的次数和自己本身出现的次数. 解题人:lingnic ...
- vue 用 :style动态修改带中划线的样式属性
今天在项目中遇到要用:style动态设置margin-top值,直接写发现报错.后来改成驼峰就成功了,记录一下 错误示范: <div class="testLeft ulData&qu ...
- HDU 2077 汉诺塔IV 递归 通项公式
刚刚做的HDU 2064很好找规律, 回忆一下: b[1] = 2; b[n] = b[n-1] *3 + 2; 可得b[n]= 3^n-1 不懂的传送门http://blog.csdn.net/mu ...
- [Nuxt] Update State with Vuex Actions in Nuxt.js
You can conditionally add classes to Vue.js templates using v-bind:class. This will help display the ...
- [React] Use React.cloneElement to Modify and Add Additional Properties to React Children
In this lesson we'll show how to use React.cloneElement to add additional properties to the children ...