1 //It is made by jump~
2 #include <iostream>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cstdio>
6 #include <cmath>
7 #include <algorithm>
8 #include <ctime>
9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <set>
13 using namespace std;
14 typedef long long LL;
15 const int MAXN = 51;
16 int n,k,total,ecnt;
17 int next[100000],first[MAXN],to[100000];
18 double mp[MAXN][MAXN],ans;
19 int pd[MAXN];
20 double d[MAXN];
21 bool ff[MAXN];
22 struct node{
23 int num;
24 double price;
25 }a[MAXN];
26
27 inline int getint()
28 {
29 int w=0,q=0; char c=getchar();
30 while((c<‘0‘ || c>‘9‘) && c!=‘-‘) c=getchar(); if(c==‘-‘) q=1,c=getchar();
31 while (c>=‘0‘ && c<=‘9‘) w=w*10+c-‘0‘, c=getchar(); return q ? -w : w;
32 }
33
34 inline void dfs(int x,double cost){
35 if(x>=total+1) {
36 if(cost<ans) ans=cost;
37 return ;
38 }
39 double gu=0;int dui[51]; int cnt=0;
40 for(int i=1;i<=n;i++) if(a[i].num!=0) dui[++cnt]=i,gu+=(double)d[i]*a[i].num;
41 if(cost+gu>=ans) return ;//对其他所有的进行估价,如果取到最优的情况都无法更新就不可能对答案有贡献
42 double now=1e20; bool use[51]; memset(use,0,sizeof(use));
43 double pric[51]; double cun[51];
44
45 int zong=0; double zong_ans=0;
46
47 for(int i=1;i<=cnt;i++) {
48 int u=dui[i];
49 now=pric[u]=a[u].price;
50 for(int j=first[u];j;j=next[j]) if(pd[to[j]]!=0) now=min(now,mp[to[j]][u]);
51 pric[u]=now;
52 if(now==d[u]) {
53 use[u]=1; cun[u]=a[u].num; pd[u]+=a[u].num; a[u].num=0;
54 zong+=cun[u]; zong_ans+=cun[u]*d[u];
55 }
56 }
57 if(zong!=0){//取到最优的先全部都买掉
58 dfs(x+zong,zong_ans+cost);
59 for(int i=1;i<=cnt;i++) {
60 int u=dui[i];
61 if(use[u]) {
62 pd[u]-=cun[u]; a[u].num+=cun[u];
63 }
64 }
65 return ;//可以return,因为最优的肯定要先买掉,不可能留到后面
66 }
67
68 for(int i=1;i<=cnt;i++) {
69 int u=dui[i];
70 if(use[u]) continue;
71 now=pric[u];
72 if(ff[u]){//之前买过一次了,那么以后都不需要一次一次买,可以一口气买完
73 cun[u]=a[u].num; pd[u]+=a[u].num; a[u].num=0;
74 dfs(x+cun[u],cost+cun[u]*now);
75 a[u].num+=cun[u]; pd[u]-=a[u].num;
76 }
77 else{
78 a[u].num--; pd[u]++; ff[u]=1;
79 gu-=d[u]; if(cost+gu+now<ans) dfs(x+1,cost+now);
80 a[u].num++; pd[u]--; ff[u]=0; gu+=d[u];
81 }
82 }
83 }
84
85 inline void work(){
86 n=getint(); for(int i=1;i<=n;i++) scanf("%lf",&a[i].price),a[i].num=getint(),total+=a[i].num,ans+=a[i].price*a[i].num;
87 int x,y; double z;
88 k=getint();for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j]=1e20;
89 for(int i=1;i<=k;i++) {
90 x=getint(); y=getint(); scanf("%lf",&z);
91 next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
92 if(mp[x][y]!=0) mp[x][y]=min(mp[x][y],z);
93 else mp[x][y]=z;
94 }
95 for(int i=1;i<=n;i++) d[i]=a[i].price;
96 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[j].num!=0) d[i]=min(mp[j][i],d[i]);
97 dfs(1,0);
98 printf("%.2lf",ans);
99 }
100
101 int main()
102 {
103 work();
104 return 0;
105 }