题解|装进肚子

由于题目链接无法解析,我直接截图展示这个题目要求找到最大甜蜜值的思路其实也很简单。

我们可以先假设所有的巧克力都应该在晚上吃,然后再挑出 k 个巧克力转为早上吃。

那么我们只需要计算出这 n 个巧克力在分别早晚的甜蜜值差值 A[i]-B[i],并进行排序,差值最大的 k 个巧克力在早上吃,代表着这 k 个巧克力可以提供更多的甜蜜值增益。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<cmath>
using namespace std;
const int N=100005;

int main(){
    int n=0,k=0;
    cin>>n>>k;
    int A[N],B[N];
    for(int i=0;i<n;i++) cin>>A[i];
    for(int i=0;i<n;i++) cin>>B[i];
    vector<int> ve;
    long long sum=0;
    
    for(int i=0;i<n;i++){
        ve.push_back(A[i]-B[i]);	//计算早晚甜蜜值差值
        sum+=B[i];		//同时对B值进行累加
    }
    
    sort(ve.begin(),ve.end(),greater<int>());	//用sort函数进行降序排序
    for(int i=0;i<k;i++) sum+=ve[i];		//差值最大的k个再累加到sum上
    
    cout<<sum;
    return 0;
}

全部评论

相关推荐

核心思路是先统计链表总长度,确定需要反转的组数,再逐组局部反转并重新连接,计算出需要反转的组数s&nbsp;=&nbsp;n/k;然后循环s次,每次对当前&nbsp;k&nbsp;个节点进行局部反转,反转后将当前组的首尾与前后部分重新连接,最后返回处理后的链表头。对应的代码解析如下:class&nbsp;Solution&nbsp;{public:ListNode*&nbsp;reverseKGroup(ListNode*&nbsp;head,&nbsp;int&nbsp;k)&nbsp;{if(!head&nbsp;||&nbsp;k&nbsp;==&nbsp;1)&nbsp;return&nbsp;head;&nbsp;//&nbsp;空链表或k=1无需反转ListNode*&nbsp;dummy&nbsp;=&nbsp;new&nbsp;ListNode(0);&nbsp;//&nbsp;虚拟头节点,简化头节点处理dummy-&gt;next&nbsp;=&nbsp;head;ListNode*&nbsp;cur&nbsp;=&nbsp;head;ListNode*&nbsp;pre&nbsp;=&nbsp;dummy;&nbsp;//&nbsp;记录上一组的尾节点ListNode*&nbsp;next&nbsp;=&nbsp;nullptr;ListNode*&nbsp;prev&nbsp;=&nbsp;nullptr;ListNode*&nbsp;temp&nbsp;=&nbsp;nullptr;&nbsp;//&nbsp;记录当前组反转前的头节点int&nbsp;n&nbsp;=&nbsp;0;while(cur&nbsp;!=&nbsp;nullptr)&nbsp;{n++;cur&nbsp;=&nbsp;cur-&gt;next;}cur&nbsp;=&nbsp;head;if(n&nbsp;==&nbsp;1)&nbsp;return&nbsp;head;&nbsp;//&nbsp;只有1个节点直接返回int&nbsp;s&nbsp;=&nbsp;n&nbsp;/&nbsp;k;&nbsp;//&nbsp;计算需要反转的组数while(s--)&nbsp;{for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;k;&nbsp;i++)&nbsp;{if(i&nbsp;==&nbsp;0)&nbsp;temp&nbsp;=&nbsp;cur;&nbsp;//&nbsp;记录当前组反转前的头节点next&nbsp;=&nbsp;cur-&gt;next;cur-&gt;next&nbsp;=&nbsp;prev;&nbsp;//&nbsp;当前节点指向前一个反转节点prev&nbsp;=&nbsp;cur;cur&nbsp;=&nbsp;next;}pre-&gt;next&nbsp;=&nbsp;prev;temp-&gt;next&nbsp;=&nbsp;cur;pre&nbsp;=&nbsp;temp;&nbsp;//&nbsp;更新上一组的尾节点为当前组反转前的头节点prev&nbsp;=&nbsp;nullptr;&nbsp;//&nbsp;重置反转前驱指针}ListNode*&nbsp;newhead&nbsp;=&nbsp;dummy-&gt;next;delete&nbsp;dummy;&nbsp;//&nbsp;释放虚拟头节点,避免内存泄漏return&nbsp;newhead;}};该解法的时间复杂度为&nbsp;O&nbsp;(n),空间复杂度为&nbsp;O&nbsp;(1)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务