回答編集履歴
11
f
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
となります。
|
12
12
|
p1~p3のいずれかが0となるようなhは除外するのですから、結局、
|
13
13
|
直交座標面(h, y)において
|
14
|
-
直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[
|
14
|
+
直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[2]*s[2]-t[2]*h
|
15
15
|
= -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
|
16
16
|
|
17
17
|
が直線 y=1と交わるときのh座標を算出し
|
10
f
answer
CHANGED
@@ -30,20 +30,20 @@
|
|
30
30
|
|
31
31
|
```lang-python
|
32
32
|
def func1(s, t):
|
33
|
-
x = sum(t) # t[0] + t[1] + t[2]
|
33
|
+
x = sum(t) # t[0] + t[1] + t[2]...
|
34
|
-
k = sum(
|
34
|
+
k = sum(ss*tt for ss, tt in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]...
|
35
35
|
|
36
36
|
if x == 0:
|
37
37
|
h = None
|
38
38
|
else:
|
39
39
|
h = (k-1)/x
|
40
40
|
hh = h
|
41
|
-
for
|
41
|
+
for ss, tt in zip(s, t):
|
42
|
-
if
|
42
|
+
if tt*(ss - hh) <= 0:
|
43
43
|
h = None
|
44
44
|
if h is None:
|
45
45
|
return None
|
46
|
-
return tuple(
|
46
|
+
return tuple(tt*(ss - h) for ss, tt in zip(s, t))
|
47
47
|
```
|
48
48
|
実行例
|
49
49
|
```lang-python
|
9
追加
answer
CHANGED
@@ -56,4 +56,14 @@
|
|
56
56
|
|
57
57
|
# answer= (0.13333333333333328, 0.3999999999999999, 0.4666666666666666)
|
58
58
|
# sum = 0.9999999999999998
|
59
|
+
|
60
|
+
s = [1, 2, 3, 2]
|
61
|
+
t = [0.2, 0.3, 0.2, 0.1]
|
62
|
+
# answer= (0.04999999999999996, 0.37499999999999994, 0.45, 0.12499999999999999)
|
63
|
+
# sum = 1.0
|
64
|
+
|
65
|
+
s = [1, 2, 3, 2]
|
66
|
+
t = [0.2, 0.3, 0.2, 0.5]
|
67
|
+
# answer= None
|
68
|
+
# sum = None
|
59
69
|
```
|
8
修正
answer
CHANGED
@@ -30,18 +30,20 @@
|
|
30
30
|
|
31
31
|
```lang-python
|
32
32
|
def func1(s, t):
|
33
|
-
x = sum(t) # t[0] + t[1] + t[2]
|
33
|
+
x = sum(t) # t[0] + t[1] + t[2] ...
|
34
|
-
k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]
|
34
|
+
k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2] ...
|
35
35
|
|
36
36
|
if x == 0:
|
37
37
|
h = None
|
38
38
|
else:
|
39
39
|
h = (k-1)/x
|
40
40
|
hh = h
|
41
|
-
for p in range(
|
41
|
+
for p in range(len(t)):
|
42
42
|
if t[p]*(s[p]-hh) <= 0:
|
43
|
+
h = None
|
44
|
+
if h is None:
|
43
|
-
|
45
|
+
return None
|
44
|
-
return tuple(t[i]*(s[i] - h) for i in range(
|
46
|
+
return tuple(t[i]*(s[i] - h) for i in range(len(t)))
|
45
47
|
```
|
46
48
|
実行例
|
47
49
|
```lang-python
|
7
修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[1]*s[1]-t[1]*h
|
15
15
|
= -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
|
16
16
|
|
17
|
-
が直線 y=1と交わるhを算出し
|
17
|
+
が直線 y=1と交わるときのh座標を算出し
|
18
18
|
求めたhがいずれのk=0,1,2についてもpk=tk(sk - h)>0を満たしているか
|
19
19
|
確認すればよいのではないでしょうか。
|
20
20
|
|
6
内容を修正しました
answer
CHANGED
@@ -1,59 +1,57 @@
|
|
1
|
-
|
1
|
+
```
|
2
|
-
具体的な数字を与えて考えてみましょう。たとえば
|
3
|
-
|
2
|
+
s = [s[0], s[1], s[2]]
|
4
|
-
|
3
|
+
t = [t[0], t[1], t[2]]
|
4
|
+
```
|
5
|
-
としたとき、
|
5
|
+
としたとき、max()を無視すれば、
|
6
|
+
```
|
6
|
-
p1=
|
7
|
+
p1 = t[0]*s[0]-t[0]*h
|
7
|
-
p2=
|
8
|
+
p2 = t[1]*s[1]-t[1]*h
|
8
|
-
p3=
|
9
|
+
p3 = t[2]*s[2]-t[2]*h
|
10
|
+
```
|
9
|
-
とな
|
11
|
+
となります。
|
12
|
+
p1~p3のいずれかが0となるようなhは除外するのですから、結局、
|
13
|
+
直交座標面(h, y)において
|
14
|
+
直線y = p1+p2+p3 = t[0]*s[0]-t[0]*h + t[1]*s[1]-t[1]*h + t[1]*s[1]-t[1]*h
|
15
|
+
= -(t[0] + t[1] + t[2])*h + (t[0]*s[0] + t[1]*s[1] + t[2]*s[2])
|
10
16
|
|
17
|
+
が直線 y=1と交わるhを算出し
|
18
|
+
求めたhがいずれのk=0,1,2についてもpk=tk(sk - h)>0を満たしているか
|
11
|
-
|
19
|
+
確認すればよいのではないでしょうか。
|
12
|
-
p1= h≦1ならば 4*(1-h) 、 h>1ならば0
|
13
|
-
p2= h≦2ならば 5*(2-h) 、 h>2ならば0
|
14
|
-
p3= h≦3ならば 6*(3-h) 、 h>3ならば0
|
15
20
|
|
21
|
+
上記で
|
22
|
+
x = t[0] + t[1] + t[2]
|
23
|
+
k = t[0]*s[0] + t[1]*s[1] + t[2]*s[2]
|
24
|
+
とおけば
|
25
|
+
y = -xh+k と y = 1の交点を求めるわけですから、
|
26
|
+
h = (k-1)/x
|
16
|
-
とな
|
27
|
+
となります。(x=0の場合は除外)
|
17
28
|
|
18
|
-
|
29
|
+
※s,tの中身によっては、解を持ちません。
|
19
30
|
|
31
|
+
```lang-python
|
20
|
-
|
32
|
+
def func1(s, t):
|
21
|
-
|
33
|
+
x = sum(t) # t[0] + t[1] + t[2]
|
22
|
-
・1<h≦2の場合
|
23
|
-
|
34
|
+
k = sum(i*j for i, j in zip(s, t)) # [0]*s[0] + t[1]*s[1] + t[2]*s[2]
|
24
|
-
・2<h≦3の場合
|
25
|
-
p1+p2+p3 = 0+0+p3 = 6*(3-h)
|
26
|
-
・3<hの場合
|
27
|
-
p1+p2+p3 = 0
|
28
35
|
|
36
|
+
if x == 0:
|
37
|
+
h = None
|
38
|
+
else:
|
39
|
+
h = (k-1)/x
|
40
|
+
hh = h
|
41
|
+
for p in range(3):
|
42
|
+
if t[p]*(s[p]-hh) <= 0:
|
43
|
+
return None
|
29
|
-
|
44
|
+
return tuple(t[i]*(s[i] - h) for i in range(3))
|
45
|
+
```
|
46
|
+
実行例
|
47
|
+
```lang-python
|
48
|
+
s = [1, 2, 3]
|
49
|
+
t = [0.4, 0.3, 0.2]
|
30
50
|
|
31
|
-
|
51
|
+
r = func1(s,t)
|
52
|
+
print("answer=", r)
|
32
|
-
|
53
|
+
print("sum = {}".format(sum(r) if r else None))
|
33
54
|
|
34
|
-
一般化すると、
|
35
|
-
a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
|
36
|
-
ak*bk≧0となる場合には
|
37
|
-
・h≦a1 → [p1+p2+p3]
|
38
|
-
・a1<h≦a2 → [p2+p3]
|
39
|
-
・a2<h≦a3 → [p3]
|
40
|
-
|
55
|
+
# answer= (0.13333333333333328, 0.3999999999999999, 0.4666666666666666)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
56
|
+
# sum = 0.9999999999999998
|
45
|
-
C=Ax+B を解いて
|
46
|
-
x=(C-B)/A (ただしA≠0。A=0のときは解なし)
|
47
|
-
|
57
|
+
```
|
48
|
-
|
49
|
-
これに倣えば
|
50
|
-
y = bk(ak - h) と y=1 の交点は
|
51
|
-
1 = bk(ak - h)
|
52
|
-
1/bk = ak - h
|
53
|
-
h= ak - 1/bk (ただし bk≠0。 bk=0の場合は解なし)
|
54
|
-
|
55
|
-
となります。
|
56
|
-
|
57
|
-
あとは上記の内容をpythonで実装するだけです。
|
58
|
-
|
59
|
-
詳しい人はpulpか何かでスマートな解き方を示してくれるかもしれませんが。
|
5
fix
answer
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
1
|
+
考え方だけ記します。
|
2
|
-
|
3
2
|
具体的な数字を与えて考えてみましょう。たとえば
|
4
3
|
a = [1, 2, 3]
|
5
4
|
b = [4, 5, 6]
|
@@ -28,7 +27,6 @@
|
|
28
27
|
p1+p2+p3 = 0
|
29
28
|
|
30
29
|
p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
|
31
|
-
**わからなかったら中学数学からやり直してください**
|
32
30
|
|
33
31
|
すると、上記の場合で
|
34
32
|
p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
|
@@ -46,7 +44,7 @@
|
|
46
44
|
y=Ax+B と y=Cの交点は、yにCを代入して
|
47
45
|
C=Ax+B を解いて
|
48
46
|
x=(C-B)/A (ただしA≠0。A=0のときは解なし)
|
49
|
-
となります
|
47
|
+
となります
|
50
48
|
|
51
49
|
これに倣えば
|
52
50
|
y = bk(ak - h) と y=1 の交点は
|
4
fix
answer
CHANGED
@@ -35,7 +35,7 @@
|
|
35
35
|
|
36
36
|
一般化すると、
|
37
37
|
a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
|
38
|
-
|
38
|
+
ak*bk≧0となる場合には
|
39
39
|
・h≦a1 → [p1+p2+p3]
|
40
40
|
・a1<h≦a2 → [p2+p3]
|
41
41
|
・a2<h≦a3 → [p3]
|
3
fix
answer
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
・h≦a1 → [p1+p2+p3]
|
40
40
|
・a1<h≦a2 → [p2+p3]
|
41
41
|
・a2<h≦a3 → [p3]
|
42
|
-
の各範囲(定義域といいます)における矢
|
42
|
+
の各範囲(定義域といいます)における矢印の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
|
43
43
|
|
44
44
|
|
45
45
|
|
2
fix
answer
CHANGED
@@ -25,21 +25,21 @@
|
|
25
25
|
・2<h≦3の場合
|
26
26
|
p1+p2+p3 = 0+0+p3 = 6*(3-h)
|
27
27
|
・3<hの場合
|
28
|
-
p1+p2+p3 =
|
28
|
+
p1+p2+p3 = 0
|
29
29
|
|
30
30
|
p1+p2+p3 = yとして、(h, y)のグラフを上記に従ってノートかなんかに描いてみましょう。
|
31
31
|
**わからなかったら中学数学からやり直してください**
|
32
32
|
|
33
|
-
すると、
|
33
|
+
すると、上記の場合で
|
34
34
|
p1+p2+p3 (= y)=1となるのは、 直線y=6*(3-h) が直線 y=1と交わる点のx座標ということになります。
|
35
35
|
|
36
|
-
|
36
|
+
一般化すると、
|
37
37
|
a1≦a2≦a3として、a1,a2,a3に対応するbを b1,b2,b3として並び替えたうえで
|
38
38
|
|
39
|
-
・h≦a1
|
39
|
+
・h≦a1 → [p1+p2+p3]
|
40
|
-
・a1<h≦a2
|
40
|
+
・a1<h≦a2 → [p2+p3]
|
41
|
-
・a2<h≦a3
|
41
|
+
・a2<h≦a3 → [p3]
|
42
|
-
の各範囲(定義域といいます)における直線
|
42
|
+
の各範囲(定義域といいます)における矢尻氏の右側に記した直線と、直線y=1の交点のx座標が、求めるべきhの値になるということがわかります。
|
43
43
|
|
44
44
|
|
45
45
|
|
1
修正
answer
CHANGED
@@ -52,8 +52,10 @@
|
|
52
52
|
y = bk(ak - h) と y=1 の交点は
|
53
53
|
1 = bk(ak - h)
|
54
54
|
1/bk = ak - h
|
55
|
-
h= ak - 1/bk ただし bk≠
|
55
|
+
h= ak - 1/bk (ただし bk≠0。 bk=0の場合は解なし)
|
56
56
|
|
57
57
|
となります。
|
58
58
|
|
59
|
-
あとは上記の内容をpythonで実装するだけです。
|
59
|
+
あとは上記の内容をpythonで実装するだけです。
|
60
|
+
|
61
|
+
詳しい人はpulpか何かでスマートな解き方を示してくれるかもしれませんが。
|