笔试训练48天:

发布时间:2026/5/28 23:23:21

笔试训练48天: 链接https://ac.nowcoder.com/acm/problem/26221来源牛客网题目描述chika很喜欢吃蜜柑。每个蜜柑有一定的酸度和甜度chika喜欢吃甜的但不喜欢吃酸的。一共有n个蜜柑chika吃k个蜜柑将获得所吃的甜度之和与酸度之和。chika想获得尽可能大的甜度总和。如果有多种方案她希望总酸度尽可能小。她想知道最终的总酸度和总甜度是多少输入描述:第一行有两个正整数n和k分别代表蜜柑总数和chika吃的蜜柑数量。(1≤k≤n≤200000) 第二行有n个正整数ai分别代表每个蜜柑的酸度。1≤ai≤1e9 第三行有n个正整数bi分别代表每个蜜柑的甜度。1≤bi≤1e9输出描述:两个正整数用空格隔开。分别表示总酸度和总甜度。示例1输入3 2 1 3 4 2 2 5输出5 7说明选择1号和3号蜜柑总酸度为5总甜度为7为最优解。思路topk问题类似排序取大的#include iostream #include algorithm using namespace std; const int N2e510; typedef pairint,intPII;//酸度甜度 PII arr[N]; int n,k; int main() { int n,k; cinnk; for(int i 0; i n; i) cin arr[i].first; for(int i 0; i n; i) cin arr[i].second; sort(arr, arr n, [](const PII a, const PII b) { if(a.second ! b.second) return a.second b.second; else return a.first b.first; }); long long s 0, t 0; for(int i 0; i k; i) { s arr[i].first; t arr[i].second; } cout s t endl; return 0; }知识点1.std::pair语法详解template class T1, class T2 struct pair { T1 first; // 第一个元素 T2 second; // 第二个元素 // 构造函数、赋值运算符等成员函数 };2.sort(arr, arr n, [](const PII a, const PII b)sort(arr, arr n, [](const PII a, const PII b) { if(a.second ! b.second) return a.second b.second; else return a.first b.first; });1.sort(arr, arr n, ...)arr是数组起始指针arr n是数组结束位置指向最后一个元素之后第三个参数是一个比较函数用来决定两个元素的先后顺序2.[]—— 捕获列表表示按引用捕获所有外部变量比如函数外的n、k等在这个 lambda 内部可以使用外部变量尽管这里没有用到但写[]是允许的3.(const PII a, const PII b)—— 参数列表PII就是std::pairint, int的别名a和b是待比较的两个元素const 避免拷贝提高效率4. 函数体 —— 比较逻辑if(a.second ! b.second) return a.second b.second; // 甜度不同时甜度大的排在前面降序 else return a.first b.first; // 甜度相同时酸度小的排在前面升序a.second b.second返回true表示a应该排在b前面这就是甜度降序酸度升序的规则

相关新闻