第一题  自己就过了18%,在牛客上学习了别人方法dp+2分查找#include<bits/stdc++.h>using namespace std;int bitsearch(vector<vector<int>> &nums, int right, int start){ // 2分查找  找到小于start的第一个nums[j]中的值  int left = 0; while(left <= right) {  int mid = left + (right-left)/2;  if(nums[mid][1]<=start)  {   left = mid +1;  } else{   right = mid -1;  } } return right;}int main(){ int n; cin >> n; vector<vector<int>> nums(n, vector<int>(3)); for(int i=0; i<n; i++) {  cin >> nums[i][0]; } for(int i=0; i<n; i++) {  cin >> nums[i][1];  nums[i][1] += nums[i][0]; // 将start_time + nums[i][1] 计算出 end_time  } for(int i=0; i<n; i++) {  cin >> nums[i][2];  } // 排序 按照第二个维度从小到达排序     sort(nums.begin(), nums.end(), [](const vector<int>& v1, const vector<int>& v2) {    return v1[1] < v2[1];    }); long dp[n+1]; // dp 数组  // dp[i] 表示第i个订单时能获得最大报酬  dp[0]=0; // 第0个订单是获得最大报酬为0  for(int i=1; i<=n; i++){ // 从1开始遍历到n 表示1到n个订单   // 对于第i个订单如果不接单,则第i个订单时获得的最大报酬和第i-1个订单一样   dp[i] = dp[i-1];  // 如果接单,需要找到接该单前能完成的第j个订单 ,根据二分查找,找到小于第i个订单的start_time  nums[i-1][0];  int j = bitsearch(nums, i-1, nums[i-1][0]);     // 第 j个订单完成后对应的值为 dp[j+1],加上第i个订单的值nums[i-1][2]   long jiedan =  dp[j+1] + nums[i-1][2];  dp[i] = max(dp[i], jiedan);  // 选择最大的  } cout << dp[n] << endl; } /*测试用例5 1 3 6 7 114 3 4 3 92 5 5 3 4输出14 */
点赞 4
评论 0
全部评论

相关推荐

08-06 15:03
中南大学
真人面试官我唯唯诺诺,AI面试我激情互喷
青春运维少年不会梦到...:好样的,没丢份
点赞 评论 收藏
分享
彧未sr:查看图片
投递牧原集团等公司10个岗位
点赞 评论 收藏
分享
为啥美团有的笔试可以AI做题啊。。。。我们怎么就不行
碧海蓝涛:因为ai也做不出来
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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