第一行输入整数
—— 测试组数。
接下来
行,每行输入
个整数
。
对每组数据输出一个整数,表示最少操作次数。
2 10 100 200 300 10 10 10 10
5 0
样例1:
第一组测试数据,可能的操作是:
初始
将弹药增加,变成
将弹药减少,变成
将钢材增加到上限,变成
将钢材减少,变成
将铝增加到上限,变成
可以发现无法使用次以下的操作来达到开发所需的资源量,所以答案为
。
第二组测试数据,开发所需的资源量就为资源初始值,所以不需要进行任何操作。
import sys
for line in sys.stdin:
data = line.split()
n = int(data[0])
break
dp = [float("inf") for _ in range(301)]
dp[10] = 0
dp[300] = 1
operation = [1, -1, 10, -10, 100, -100]
count = 0
while float("inf") in dp:
for i in range(301):
if dp[i] == count:
for op in operation:
x = i + op
if 0 <= x <= 300 and dp[x] == float("inf"):
dp[x] = count + 1
count += 1
for line in sys.stdin:
data = line.split()
data = [int(x) for x in data]
print(sum(dp[num] for num in data)) from collections import deque
import sys
T = int(input().strip())
memo = [-1] * 301 # BFS先走完10-300的表,后续查表就行,不用每次都算
memo[10] = 0 # 前面 0-9 十个索引可以浪费,达到初始值直接查表目的
dq = deque([10]) # 题目初始值为10
while dq:
cur = dq.popleft()
# 同时满足加减和赋值
for operation in [
cur + 1, cur - 1,
cur + 10, cur - 10,
cur + 100, cur - 100,
300
]:
# 得没修改过然后不越界才得到最少操作次数,这里防止memo[operation]索引越界才放后面
if 10 <= operation <= 300 and memo[operation] == -1:
dq.append(operation)
memo[operation] = memo[cur] + 1
res = []
for line in sys.stdin:
a, b, c, d = map(int, line.strip().split())
res.append(memo[a] + memo[b] + memo[c] + memo[d])
sys.stdout.write('\n'.join(map(str, res)))
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
vector<int> step_mini(305, -1);
int op(int num, int x) {
if (x == 1) return num + 1;
else if (x == 2) return num - 1;
else if (x == 3) return num + 10;
else if (x == 4) return num - 10;
else if (x == 5) return num + 100;
else if (x == 6) return num - 100;
else if (x == 7) return 300;
else if (x == 8) return 10;
else{
cout << "????";
return 1;
};
}
void BFS(int start) {
queue<int> q;
set<int> visited;
int step = 0;
q.push(start);
visited.insert(start);
while (!q.empty()) {
int sz = q.size();
for (int k = 0; k < sz; k++) {
int cur = q.front();
q.pop();
for (int i = 1; i <= 8; i++) {
int nex = op(cur, i);
if (nex >= 10 && nex <= 300 && !visited.count(nex)) {
q.push(nex);
visited.insert(nex);
if(step_mini[nex] == -1)step_mini[nex] = step + 1;
}
}
}
step++;
}
}
int main() {
step_mini[10] = 0;
int T;
cin >> T;
BFS(10);
while (T--) {
int sum = 0;
for(int i = 0; i < 4; i++){
int x;
cin >> x;
sum += step_mini[x];
}
cout << sum << endl;
}
}
// 64 位输出请用 printf("%lld") 打表
package main
import (
"fmt"
)
type Node struct{
value, step int
}
var result [301]int // 存储10到其他数值所需的操作次数
func BFS() { // 计算10到其他数值所需的操作次数
for i:=0;i<=300;i++{
result[i] = -1
}
queue := []Node{{10,0}}
result[10]=0
var cur Node
var dist []int
for len(queue) > 0{
cur = queue[0]
queue = queue[1:]
dist = []int{
cur.value-1,cur.value+1,
cur.value+100,cur.value-100,
cur.value+10, cur.value-10,
10, 300,
}
for _, d := range dist {
if d < 10 || d >300 || result[d] != -1{
continue
}
result[d] = cur.step + 1
queue = append(queue, Node{d, cur.step+1})
}
}
}
func main() {
var a, b, c, d int
var t int
fmt.Scanf("%d", &t)
BFS()
for t >0 {
t--
fmt.Scanf("%d %d %d %d", &a, &b, &c, &d)
fmt.Println(result[a]+result[b]+result[c]+result[d])
}
}