Interesting Calculator UVA - 12664
题目链接:https://cn.vjudge.net/problem/UVA-12664
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
#define ms(s, x) memset(s, x, sizeof(s))
using namespace std;
const int maxn = 1e5 + 10;
int cost[3][10];
int cnt[maxn], dist[maxn];
void bfs(int x, int y);
bool isbetter(int v, int u, int t, int j);
int main(void)
{
int x, y, kase = 0;
while (cin >> x >> y) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 10; j++)
scanf("%d", &cost[i][j]);
bfs(x, y);
printf("Case %d: %d %d\n", ++kase, dist[y], cnt[y]);
}
return 0;
}
void bfs(int x, int y)
{
ms(dist, 0x3f3f3f3f);
ms(cnt, 0x3f3f3f3f);
dist[x] = 0, cnt[x] = 0;
if (x)
dist[0] = cost[2][0], cnt[0] = 1;
for (int i = 0; i <= y; i++) {
for (int j = 0; j < 10; j++) {
int v = i * 10 + j;
if (v <= y && isbetter(v, i, 0, j)) {
dist[v] = dist[i] + cost[0][j];
cnt[v] = cnt[i] + 1;
}
}
for (int j = 0; j < 10; j++) {
int v = i + j;
if (v <= y && isbetter(v, i, 1, j)) {
dist[v] = dist[i] + cost[1][j];
cnt[v] = cnt[i] + 1;
}
}
for (int j = 0; j < 10; j++) {
int v = i * j;
if (v <= y && isbetter(v, i, 2, j)) {
dist[v] = dist[i] + cost[2][j];
cnt[v] = cnt[i] + 1;
}
}
}
return;
}
bool isbetter(int v, int u, int t, int j)
{
if (dist[v] > dist[u] + cost[t][j])
return true;
if (dist[v] == dist[u] + cost[t][j]
&& cnt[v] > cnt[u] + 1)
return true;
return false;
}