FatMouse‘s Speed
发布日期:2021-05-08 16:30:18 浏览次数:20 分类:精选文章

本文共 1718 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到猫的体重和速度的最长子序列,其中体重是递增的,而速度是严格递减的。以下是详细的解决方案:

方法思路

  • 问题分析:我们需要找到一个最长的子序列,使得体重递增且速度递减。这个问题类似于寻找最长递增子序列(LIS),但这里还需要满足速度递减的条件。
  • 数据结构:使用一个结构体来记录每个猫的体重、速度和序号。
  • 排序:按照速度从高到低排序,这样在处理每个猫时,后面的猫速度会低于前面的猫。
  • 动态规划:使用动态规划数组 dp,其中 dp[i] 表示以第 i 个猫结尾的最长子序列的长度。
  • 状态转移:对于每个猫,检查所有前面的猫,满足速度和体重条件的情况下,更新 dp[i]
  • 结果记录:记录全局最长子序列的长度和对应的猫的序号。
  • 解决代码

    #include 
    #include
    using namespace std;struct Cat { int weight; int speed; int original_id;};bool compare(const Cat& a, const Cat& b) { if (a.speed != b.speed) { return a.speed > b.speed; } return a.weight < b.weight;}int main() { int n; vector
    cats; while (cin >> n) { cats.push_back({n, n, n}); } sort(cats.begin(), cats.end(), compare); vector
    dp(n + 1, 0); int max_len = 0; vector
    result_ids; for (int i = n; i >= 1; --i) { for (int j = i - 1; j >= 1; --j) { if (cats[j].speed > cats[i].speed && cats[j].weight < cats[i].weight) { if (dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; if (dp[i] > max_len) { max_len = dp[i]; result_ids = vector
    (dp[i], 0); for (int k = dp[i]-1; k >=0; --k) { result_ids[k] = cats[i].original_id - (i - k); } } } } } } cout << max_len << endl; for (int id : result_ids) { cout << id << " "; } cout << endl; return 0;}

    代码解释

  • 结构体定义Cat 结构体存储每个猫的体重、速度和原有的序号。
  • 比较函数:用于排序猫的速度和体重,确保速度递减且体重递增。
  • 输入处理:读取输入数据并存储到 cats 向量中。
  • 排序:按照速度和体重对 cats 进行排序。
  • 动态规划初始化dp 数组用于记录每个位置的最长子序列长度。
  • 双重循环处理:从后往前处理每个猫,检查前面所有满足条件的猫,更新 dp 数组。
  • 结果记录和输出:记录最长子序列的长度和对应的猫的原始序号,最后输出结果。
  • 这种方法确保了我们能够找到满足条件的最长子序列,并且代码结构清晰,逻辑严密。

    上一篇:D. Shortest and Longest LIS
    下一篇:Tickets

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年05月16日 21时42分11秒