Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
193907 luckypet 和谐俱乐部 C++ 解答错误 0 0 MS 252 KB 2117 2025-05-27 14:59:24

Tests(0/10):


#include <iostream> #include <vector> #include <algorithm> using namespace std; // 定义一个结构体来存储会员信息 struct Member { int A, B; }; // 比较函数,用于按A值排序会员 bool compareMembers(const Member& m1, const Member& m2) { if (m1.A != m2.A) { return m1.A < m2.A; } else { // 如果A值相同,我们可以按B值的任意顺序排序,因为题目只要求最长序列的长度 // 这里选择按B值升序排序是为了保持一致性,但实际上这个比较在A值不同时不会被用到 return m1.B < m2.B; } } // 二分查找函数,用于在dp数组中找到可以插入当前B值的最大位置 int binarySearch(const vector<int>& dp, int B) { int left = 0, right = dp.size() - 1; int result = dp.size(); // 初始化结果为dp数组大小,表示如果找不到合适位置,则插入到末尾 while (left <= right) { int mid = left + (right - left) / 2; if (dp[mid] < B) { result = mid; // 更新结果位置 left = mid + 1; } else { right = mid - 1; } } return result; } int main() { int N; cin >> N; vector<Member> members(N); for (int i = 0; i < N; ++i) { cin >> members[i].A >> members[i].B; } // 按A值排序会员 sort(members.begin(), members.end(), compareMembers); // 使用动态规划和二分查找计算最长递增子序列的长度 vector<int> dp; // dp数组存储当前找到的最长递增子序列 for (const auto& member : members) { int pos = binarySearch(dp, member.B); if (pos == dp.size()) { dp.push_back(member.B); // 如果找不到合适位置,则插入到末尾 } else { dp[pos] = member.B; // 否则更新找到的位置的值(这里其实不需要更新为当前B值,因为只关心长度) } } // 输出最长不嫉妒会员序列的长度 cout << dp.size() << endl; return 0; }


测评信息: