結果
| 問題 |
No.2057 Ising Model
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-05-12 02:10:00 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 20 ms / 2,000 ms |
| コード長 | 2,048 bytes |
| コンパイル時間 | 12,822 ms |
| コンパイル使用メモリ | 249,108 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-05-12 02:10:17 |
| 合計ジャッジ時間 | 15,649 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 44 |
ソースコード
package main
import . "fmt"
func main() {
var n,a,b int
Scan(&n,&a,&b)
ans:=solve(n,a,b)
Println(ans)
}
func solve(n, a, b int) int {
// S = [1, 1, 1, 1, 1, 1, 1, ... , 1]
// ans = A*(N-1) - B*N
// S = [1, -1, 1, -1, 1, -1, 1, ... , -1, 1] (N is odd)
// ans = -A*(N-1) - B
// S = [1, -1, 1, -1, 1, -1, 1, ... , -1] (N is even)
// ans = -A*(N-1)
ans := min(a*(n-1)-b*n,-a*(n-1)-b*(n%2))
// S = [1, -1, 1, -1, ... , 1, -1, 1, 1, ... , 1, 1, 1, 1]
// S = [-1, 1, -1, 1, ... , 1, -1, 1, 1, ... , 1, 1, 1, 1]
// p | N-p
// 1 <= i < p : S[i] = -S[i+1]
// p <= i <= N : S[i] = 1
// p is odd
// 1 <= i <= p: -A*(p-1) - B
// p < i <= N: A*(N-p) - B*(N-p)
// f(S{p}) = -A*(p-1) - B + A*(N-p) - B*(N-p)
// = A*(N-2*p+1) - B*(N-p+1)
// p is even
// 1 <= i <= p: -A*(p-1)
// p < i <= N: A*(N-p) - B*(N-p)
// f(S{p}) = -A*(p-1) + A*(N-p) - B*(N-p)
// = A*(N-2*p+1) - B*(N-p)
//
// f(S{p+2}) - f(S{p}) = -4*A + 2*B < 0
// -> 2*A > B
//
// f(S{p+2}) - f(S{p}) = -4*A + 2*B > 0
// -> 2*A < B
//
// f(S{p+2}) - f(S{p}) = -4A + 2*B == 0
// -> 2*A == B
//
{
p := n-1
if p % 2 == 0 {
ans = min(ans, a*(n-2*p+1)-b*(n-p))
} else {
ans = min(ans, a*(n-2*p+1)-b*(n-p+1))
}
}
return ans
}
func init() {
check()
}
func check() {
for n := 10; n < 13; n++ {
for a := n-2; a <= n+2; a++ {
for b := n-2; b <= n+2; b++ {
ans1 := solve(n,a,b)
ans2, f := bruteforce(n, a, b)
if ans1 != ans2 {
panic(Sprintf("n=%d,a=%d,b=%d,ans1=%d,ans2=%d,f=%b",n,a,b,ans1,ans2,f))
}
}
}
}
}
func bruteforce(n, a, b int) (int, int) {
if n > 20 {
panic("N > 20")
}
ans := a*(n-1) - b * n
f := (1<<n)-1
for i := 0; i < (1<<n); i++ {
tmp := 0
for j := 0; j < n-1; j++ {
s1 := 2*((i>>j)&1)-1
s2 := 2*((i>>(j+1))&1)-1
tmp += a * s1*s2
}
for j := 0; j < n; j++ {
s := 2*((i>>j)&1)-1
tmp -= b * s
}
if tmp < ans {
ans = tmp
f = i
}
}
return ans, f
}
ID 21712