站外题 求是否有思路错误(悬关)
  • 板块学术版
  • 楼主残阳如血
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/9 20:23
  • 上次更新2024/10/9 21:50:16
查看原帖
站外题 求是否有思路错误(悬关)
726139
残阳如血楼主2024/10/9 20:23

我的思路是差分约束,在相邻两个人之间连边。

但是这道题标签好像是贪心,想不到贪心策略。

错误样例输入:

14
9 3 8 1 4 6 8 8 4 0 2 8 8 8

样例输出

28

实际输出

45
#include <bits/stdc++.h>
using pii = std::pair<int, int>;
const int N = 110;

bool vis[N];
std::queue<int> q;
std::vector<pii> g[N];
int ans, n, s[N], dis[N];

void add(int u, int v, int w) {
  g[u].push_back({v, w});
}

int main() {
  std::cin >> n;
  for (int i = 1; i <= n; ++i) std::cin >> s[i];

  for (int i = 1; i <= n; ++i) {
    if (i != n) {
      if (s[i] > s[i + 1]) add(i, i + 1, -1);
      else if (s[i] < s[i + 1]) add(i + 1, i, -1);
    }
  }

  memset(dis, 0x3f, sizeof(dis));
  dis[0] = 0;
  for (int i = 1; i <= n; ++i) add(0, i, 0);

  q.push(0);
  while (!q.empty()) {
    int u = q.front(); q.pop();
    vis[u] = false;

    for (auto to : g[u]) {
      if (dis[to.first] > dis[u] + to.second) {
        dis[to.first] = dis[u] + to.second;
        if (!vis[to.first]) q.push(to.first), vis[to.first] = true;
      }
    }
  }


  int minn = *std::min_element(dis + 1, dis + n + 1);
  for (int i = 1; i <= n; ++i)
    ans += dis[i] - minn + 1;
  std::cout << ans << std::endl;

  return 0;
}
2024/10/9 20:23
加载中...