某公司加工一種由鐵、鋁、錫組成的合金。他們的工作很簡單。首先進口一些鐵鋁錫合金原材料,不同種類的原材料中鐵鋁錫的比重不同。然後,將每種原材料取出一定量,經過融解、混合,得到新的合金。新的合金的鐵鋁錫比重為使用者所需要的比重。
現在,使用者給出了 \(n\) 種他們需要的合金,以及每種合金中鐵鋁錫的比重。公司希望能夠訂購最少種類的原材料,並且使用這些原材料可以加工出使用者需要的所有種類的合金。
第一行兩個整數 \(m\) 和 \(n\),分別表示原材料種數和使用者需要的合金種數。
第 \(2\) 到 \(m+1\) 行,每行三個實數 \(a_i, b_i, c_i\),分別表示鐵鋁錫在一種原材料中所佔的比重。
第 \(m+2\) 到 \(m+n+1\) 行,每行三個實數 \(d_i, e_i, f_i\),分別表示鐵鋁錫在一種使用者需要的合金中所佔的比重。
乙個整數,表示最少需要的原材料種數。若無解,則輸出–1
。
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
對於全部的測試點,滿足 \(1\le m,n\le 500\),\(0 \leq a_i,b_i,c_i,d_i,e_i,f_i \leq 1\),且 \(a_i+b_i+c_i=1\),\(d_i+e_i+f_i=1\),小數點後最多有六位數字。
發現只需要用前兩個比重就能夠表示一種合金。不妨將一種合金看做是乙個向量,問題就變成最少能用多少種向量表示出所有的目標向量。
因為所需要的合金單位體積為1,由向量表示的定理:
若 \(\vec\) 能夠被 \(\vec\) 和 \(\vec\) 表示,則存在 \(x+y=1\) 滿足 \(x\vec+y\vec=\vec\)即兩個合金能夠任意比例混合得到的合金對應的點一定在這兩個合金對應的點的連線上。推廣一下,三個合金能夠任意比例混合得到的合金一定在這三個合金組成的三角形裡面。因此我們只要找到由原材料組成的凸包能夠包括所有目標向量即可。
對於每乙個可行的有向線段,我們都把他看做是有向邊。列舉完所有有向線段後,我們跑一邊圖上最小環即可。
#include #include #include #include #define int long long
#define n 502
using namespace std;
const double eps=1e-7;
int n,m,i,j,k,g[n][n],dis[n][n];
double a[n],b[n],c[n],d[n],e[n],f[n];
double cal(int x,int y,int z)
signed main()
for(i=1;i<=m;i++) scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
for(i=1;i<=n;i++) scanf("%lf%lf%lf",&d[i],&e[i],&f[i]);
for(i=1;i<=m;i++)
} if(flag)
} for(i=1;i<=m;i++)
}if(flag) g[i][j]=dis[i][j]=1;
} }int ans=1<<30;
for(k=1;k<=m;k++)
} for(i=1;i<=m;i++)
} if(ans==1<<30) puts("-1");
else printf("%lld\n",ans);
return 0;
}
洛谷P4049 JSOI2007 合金 題解
題目鏈結 首先,材料的前兩個屬性可以唯一確定乙個材料,合金的前兩個樹形也可以唯一確定乙個材料。那麼材料和合金都可以被看成平面上的點 a i,b i 或 d i,e i 不難發現,一些材料能表示出一種合金當且僅當這個合金 在平面上的點 在選取的材料 在平面上的點 組成的凸包內。不難發現,選取的點凸包上...
洛谷 P2145 JSOI2007 祖碼
一道特別毒瘤的題,好像目前沒有完全的正解,只有乙個比較優的解法 f i j 表示從i j所用的最小數量.首先,去重,就是將所有連續的相同的點縮成乙個點,sum i 表示縮點後新圖第i個位置有幾個點.如果g i g j 加起來的數量大於等於三 sum i sum j 3 則f i j f i 1 j ...
洛谷P4053 JSOI2007 建築搶修
小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復每個建築...