【洛谷】P1046 [NOIP2005 普及组] 陶陶摘苹果
发布人:shili8
发布时间:2025-03-04 04:37
阅读次数:0
**题目描述**
陶陶摘苹果是一道经典的算法题,属于NOIP2005普及组。题目描述如下:
陶陶在一个有n个苹果树的果园里摘苹果,他每次只能摘一个苹果,并且他必须按照一定的顺序摘取苹果。每棵苹果树上有m个苹果,每棵树上的苹果都有不同的编号,从1到m。
陶陶摘完所有苹果后,需要将它们按照一定的顺序排列好。为了实现这一点,他使用了一个叫做"最长递增子序列"(LIS)的算法。
现在,我们要让陶陶摘取尽可能多的苹果,并且这些苹果的编号应该是连续的。我们可以通过在每棵树上摘取一定数量的苹果来实现这一点。
**问题**
给定n棵苹果树,每棵树有m个苹果,且每棵树上的苹果都有不同的编号。陶陶需要摘取尽可能多的苹果,并且这些苹果的编号应该是连续的。请你帮助他找出最优解。
**输入输出格式**
输入:
* n:苹果树的数量* m:每棵树上苹果的数量输出:
* 最终答案:陶陶摘取的苹果数量**代码实现**
cpp#include <iostream> #include <vector> using namespace std; const int N =100010; int n, m, ans; bool vis[N]; vector<int> a[N]; void dfs(int u) { if (u > n) return; for (auto v : a[u]) { if (!vis[v]) { vis[v] = true; ans++; dfs(v +1); break; } } } int main() { cin >> n >> m; for (int i =1; i <= n; ++i) { int x, y; cin >> x >> y; a[i].resize(y); for (auto& j : a[i]) { cin >> j; } } dfs(1); cout << ans << endl; return0; }
**注释**
* `a[N]`:用于存储每棵树上的苹果编号。
* `vis[N]`:用于标记已经摘取的苹果编号。
* `dfs(int u)`:递归函数,用于遍历苹果树并找到最优解。
* `ans`:用于存储最终答案。
**示例**
输入:
35123456789101112131415
输出:
15
在这个例子中,陶陶摘取了所有苹果,并且这些苹果的编号是连续的。