当前位置:实例文章 » 其他实例» [文章]【洛谷】P1046 [NOIP2005 普及组] 陶陶摘苹果

【洛谷】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


在这个例子中,陶陶摘取了所有苹果,并且这些苹果的编号是连续的。

相关标签:
其他信息

其他资源

Top