题目:
题意:
n个瓶子,每个瓶子都有相应的水的数量,瓶子的水可以乘2或者除2,求出最少多少步骤可以使瓶子中的所有水相等。
思路:
将所有瓶子可以到达的毫升数及其步数记录起来,得到可以n个瓶子都能到达的毫升数的最小步数。
AC.
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int maxn = 1e5+5;
int step[maxn], cnt[maxn], vis[maxn];
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
queue<pair<int, int> > q;
memset(step, 0, sizeof(step));
memset(vis, 0, sizeof(vis));
memset(cnt, 0, sizeof(cnt));
int a;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a);
q.push(make_pair(a, 0));
while(!q.empty()) {
int x = q.front().first, y = q.front().second;
q.pop();
if(x > maxn - 2) continue;
if(vis[x] == i) continue;
vis[x] = i;
cnt[x]++;
step[x] += y;
q.push(make_pair(x*2, y+1));
q.push(make_pair(x/2, y+1));
}
}
int ans = 0x3f3f3f;
for(int i = 1; i < maxn; ++i) {
if(cnt[i] == n) {
ans = min(ans, step[i]);
}
}
printf("%d\n", ans);
}
return 0;
}