70PTS,因为没输出而错 ,求大佬看看哪个地方没考虑清楚
查看原帖
70PTS,因为没输出而错 ,求大佬看看哪个地方没考虑清楚
1023600
ShelpAm楼主2023/12/13 19:39

这是提交记录链接: https://www.luogu.com.cn/record/139462836

大佬们不愿点开也可以看这段又臭又长(前面一大段都是板子)的代码 (C++20)

#include <algorithm>
#include <array>
#include <cmath>
#include <cstddef>
#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>

// configs
using ::std::size_t;

namespace impl {
  template<typename value_t> using vec2 = std::vector<std::vector<value_t>>;
  template<typename T> concept is_pair = requires(T t) {
    t.first;
    t.second;
  };
} // namespace impl
template<size_t i, size_t j, typename value_t> using arr2 = std::array<std::array<value_t, j>, i>;
template<size_t i, size_t j> using arr2uz = arr2<i, j, size_t>;
template<size_t i, size_t j> using arr2ll = arr2<i, j, long long>;
template<typename value_t> class vec2 : public impl::vec2<value_t> {
public:
  vec2(size_t const i, size_t const j): impl::vec2<value_t>(i, std::vector<value_t>(j)) {}
};
using vec2uz = vec2<size_t>;
using vec2ll = vec2<long long>;
auto&& operator>>(auto&& is, auto&& t)
{
  if constexpr (std::ranges::range<decltype(t)>) {
    for (auto&& ele: t) {
      is >> ele;
    }
  }
  else if constexpr (impl::is_pair<decltype(t)>) {
    is >> t.first >> t.second;
  }
  else {
    is >> t;
  }
  return is;
}
auto&& operator<<(auto&& os, auto&& t)
{
  if constexpr (std::ranges::range<decltype(t)>) {
    for (auto&& ele: t) {
      os << ele << ' ';
    }
    os << '\n';
  }
  else if constexpr (impl::is_pair<decltype(t)>) {
    os << t.first << ": " << t.second << ", ";
  }
  else {
    os << t << ' ';
  }
  return os;
}
void debug([[maybe_unused]] std::string_view const& sv, [[maybe_unused]] auto&& t)
{
#ifdef DEBUG
  std::cout << sv << ": " << t << '\n';
#endif
}
void solve_case()
{
  size_t n{};
  size_t begin_level{};
  size_t max_level{};
  std::cin >> n >> begin_level >> max_level;

  vec2<bool> dp(n + 1, max_level + 1);
  dp[0][begin_level] = true;
  for (size_t i{1}; i != n + 1; ++i) {
    size_t c{};
    std::cin >> c;
    bool found{};
    for (size_t j{}; j != max_level + 1; ++j) {
      if (j >= c || j + c <= max_level) {
        found = true;
      }
      if (j >= c) {
        dp[i][j] = dp[i][j] || dp[i - 1][j - c];
      }
      if (j + c <= max_level) {
        dp[i][j] = dp[i][j] || dp[i - 1][j + c];
      }
    }
    if (!found) {
      std::cout << -1;
      return;
    }
  }
  for (size_t i{max_level}; i != -1UZ; --i) {
    if (dp[n][i]) {
      std::cout << i;
      return;
    }
  }
}
int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  // std::cout.tie(nullptr);

  size_t t{1};
  // std::cin >> t;
  for (size_t i{}; i != t; ++i) {
    solve_case();
  }
  return 0;
}
2023/12/13 19:39
加载中...