2026/1/15 0:50:15
网站建设
项目流程
帮企业外卖网站做推,网站开发项目策划,口碑好的五屏网站建设,云阳网站制作给你一个下标从 0 开始的二维整数数组 events #xff0c;其中 events[i] [startTimei, endTimei, valuei] 。第 i 个活动开始于 startTimei #xff0c;结束于 endTimei #xff0c;如果你参加这个活动#xff0c;那么你可以得到价值 valuei 。你 最多 可以参加 两个时间…给你一个下标从0开始的二维整数数组events其中events[i] [startTimei, endTimei, valuei]。第i个活动开始于startTimei结束于endTimei如果你参加这个活动那么你可以得到价值valuei。你最多可以参加两个时间不重叠活动使得它们的价值之和最大。请你返回价值之和的最大值。注意活动的开始时间和结束时间是包括在活动时间内的也就是说你不能参加两个活动且它们之一的开始时间等于另一个活动的结束时间。更具体的如果你参加一个活动且结束时间为t那么下一个活动必须在t 1或之后的时间开始。示例 1:输入events [[1,3,2],[4,5,2],[2,4,3]]输出4解释选择绿色的活动 0 和 1 价值之和为 2 2 4 。示例 2输入events [[1,3,2],[4,5,2],[1,5,5]]输出5解释选择活动 2 价值和为 5 。示例 3输入events [[1,5,3],[1,5,1],[6,6,5]]输出8解释选择活动 0 和 2 价值之和为 3 5 8 。提示2 events.length 10^5events[i].length 31 startTimei endTimei 10^91 valuei 10^6分析设取的第二个活动开始时间为 startTime则问题转化为遍历所有活动作为取的第二个活动如何取第一个活动使得参加的两个活动价值最大。按照结束时间从小到大排序后假设有如下两个活动活动 A 结束于 3 时刻价值 999。活动 B 结束于 6 时刻价值 9。因为我们已经取了要参加的第二个活动所以对于上面的这两个活动不关心开始时间。很明显活动 B 是没有意义的因为它的结束时间更晚而价值更低。对于同样的第二个活动开始时间取活动 A 作为第一个活动是更优的活动 B 可以完全被活动 A 代替。可以用一个数组按照结束时间从小到大活动价值从小到大记录可选的活动。由于之前已经按照结束时间升序排序记录时只需要按照活动价值从小到大记录即可类似于活动 A 和活动 B 的情况只记录活动 A 即可。遍历所有活动时可以对这个记录数组进行二分查找找到一个价值最大且结束时间小于开始时间的活动如果找不到则当前活动只能单独取。最后取最大值作为答案。typedef struct node { int endTime,value; }node; int cmp(const void *a,const void *b) { node *aa(node*)a; node *bb(node*)b; if(aa-endTime!bb-endTime)return aa-endTime-bb-endTime; return aa-value-bb-value; } int maxTwoEvents(int** events, int eventsSize, int* eventsColSize) { node num[eventsSize5],val[eventsSize5]; for(int i0;ieventsSize;i) num[i].endTimeevents[i][1],num[i].valueevents[i][2]; qsort(num,eventsSize,sizeof(node),cmp); int cnt1; val[0].endTime0,val[0].value0; for(int i0;ieventsSize;i) if(num[i].valueval[cnt-1].value)val[cnt]num[i],cnt; int ans0; for(int i0;ieventsSize;i) { int l0,rcnt,stevents[i][0],tempevents[i][2]; while(lr) { int mid(lr)/2; if(val[mid].endTimest)tempval[mid].valueevents[i][2],lmid1; else rmid; } ansfmax(ans,temp); } return ans; }