BZOJ 1027 合金 計算幾何,Floyd判環

2021-07-26 06:29:31 字數 2156 閱讀 9064

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

10 10

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

5解題方法:

第三維可以由前兩維確定,所以可以無視

兩種原料能配成的產品一定在兩點間線段

轉化成在m個點裡找最少點,圍成的多邊形包括了n個目標點

floyd求最小環。。。

否則dis[a][b]=inf

答案是min

特判下所有點重合/共線

**如下:

#include 

using

namespace

std;

#define eps 1e-10

const

int inf = 1e8;

void getmin(int &x, int y)

struct point

point(double x, double y) : x(x), y(y) {}

}a[505], b[505];

int dis[505][505];

double cross(point u, point v)

point operator -(point u, point v)

int n, m;

bool isinline(point u, point v)

if(u.y > v.y) swap(u, v);

for(int i = 1; i <= m; i++)

return1;}

int leftorright(point u, point v)

if(!c1 && !c2 && isinline(u, v))

if(c1) return

1; if(c2) return

2; return3;}

void floyd()}}

}}

for(int i = 1; i <= n; i++)

if(ans == inf || ans <= 2)

else

}void getmaze()

}floyd(); //必須寫在這裡,不能寫在外面,因為返回-1代表不滿足了

}bool pre_judge()

for(int i = 1; i <= m; i++)

puts("1");

return1;}

int main()

getmaze();

return

0;}

BZOJ 1027 合金(凸包 最小環)

題意 三種合金的材料若干種。需求合金若干種。每種需求合金可以由材料合金混合得到。問最少需要多少種材料能夠混合出所有需要的合金?struct point point operator point a double operator point a double operator point a poi...

BZOJ3707 圈地 計算幾何

2維平面上有n個木樁,黃學長有一次圈地的機會並得到圈到的土地,為了體現他的高風亮節,他要使他圈到的土地面積盡量小。圈地需要圈乙個至少3個點的多邊形,多邊形的頂點就是乙個木樁,圈得的土地就是這個多邊形內部的土地。因為黃學長非常的神,所以他允許圈出的第n點共線,那樣面積算0 對於100 的資料,n 10...

BZOJ2640 可見區域 計算幾何 平衡樹

題目鏈結 題意 給定n nn條互不相交的線段,從原點向四周看,視線遇到線段會被擋住。求此時能看到的視野範圍,以及分別刪除一條和兩條線段後能看到最大的視野範圍。n 50 000 n le 50,000 n 50,0 00cy拉我做題啦啦啦 考慮用迴圈掃瞄線 就是從原點開始繞360度的掃瞄線 維護每個時...