关注
#include<iostream>
(5488)#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
int k;
cin>>k;
vector<int> pos(n);
for(int i=0;i<n;i++){
cin>>pos[i];
}
//先对pos排序
sort(pos.begin(),pos.end());
int l=0,r=0;
vector<int> cover(n);
//双指针法,求出cover[0..n-1]
//cover[i]表示在pos中下标i之后(包括i)共有多少个馅饼与pos[i]的距离在k之内
//比如pos: 1 1 2 3 4 5 5
//如果k=1,则对应的cover: 3 2 2 2 3 2 1
while(l<n){
while(r<n&;;&;;pos[r]-pos[l]<=k){
++r;
}
cover[l]=(r-l);
++l;
}
/*
dp[i][j]表示: 必须恰好有j次选择了吃馅饼,
从pos中下标i开始选择吃或者不吃馅饼,
一直选到pos中的最后一个位置所能吃到的最多馅饼数量
*/
vector<vector<int>> dp(n);
for(int i=0;i<n;i++) {
dp[i].resize(3);
}
//必须选择吃2次馅饼,但此时只有最后一个馅饼,不符合题意,赋予-1方便后续比较
dp[n-1][2]=-1;
//必须选择吃1次馅饼,但此时只有最后一个馅饼,必须也只能选择吃它
dp[n-1][1]=1;
for(int i=n-2;i>=0;i--) {
for(int j=1;j<3;j++){
/*如果i+cover[i]==n并且必须恰好要有2次选择吃馅饼,
说明此时这个馅饼一定不能选择吃
否则的话,假如我们选择吃它,就会剩下一次必须选择吃馅饼的机会
但却没有馅饼可吃了,所以直接dp[i][j]=dp[i+1][j]*/
if(i+cover[i]==n&;;&;;j==2){
dp[i][j]=dp[i+1][j];
}
/*如果i+cover[i]==n并且必须恰好要有1次选择吃馅饼,
说明pos[i]这个馅饼一定要选择吃,因为这样会吃完pos[i]以及之后
的所有馅饼,一定是最多数量,直接dp[i][j]=cover[i]即可
*/
else if(i+cover[i]==n&;;&;;j==1){
dp[i][j]=cover[i];
}
/*如果i+cover[i]<n并且必须恰好要有1次选择吃馅饼(说明之前已经选择了一次,所以还剩下1次),
说明此时这个馅饼(pos[i])可以选择吃,也可以选择不吃,看哪个能吃到的数量更多就选择哪个方案
*/
else if(i+cover[i]<n&;;&;;j==1){
dp[i][j]=max(cover[i],dp[i+1][j]);
}
/*如果i+cover[i]<n并且必须恰好要有2次选择吃馅饼(说明之前还没有一次选择吃馅饼,所以还剩下2次),
说明此时这个馅饼(pos[i])可以选择吃,也可以选择不吃,看哪个能吃到的数量更多就选择哪个方案
*/
else if(i+cover[i]<n&;;&;;j==2){
dp[i][j]=max(dp[i+cover[i]][j-1]+cover[i],dp[i+1][j]);
}
}
}
// 从pos[0]开始决策,必须恰好只有2次选择吃馅饼的情况下所能吃到的最多数量即为答案
cout<<dp[0][2]<<endl;
return 0;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 第一次找实习,我建议__ #
22265次浏览 292人参与
# 韶音科技求职进展汇总 #
60756次浏览 505人参与
# 从mentor身上学到了__ #
19617次浏览 304人参与
# 你怎么评价今年的春招? #
142551次浏览 1389人参与
# 什么样的公司千万别去 #
17108次浏览 115人参与
# 上班摸鱼,你都在干些什么? #
31581次浏览 227人参与
# 外出实习被同学举报 #
4378次浏览 32人参与
# 你投递的公司有几家约面了? #
149967次浏览 982人参与
# 秋招的嫡长offer #
313015次浏览 1881人参与
# 秋招暂停,我将对以下公司做出处罚__ #
30023次浏览 137人参与
# 秋招结束之后的日子 #
106414次浏览 1017人参与
# 你认为工作的意义是什么 #
203829次浏览 1289人参与
# 秋招我要惩罚这些公司 #
3269次浏览 22人参与
# 打工人的至爽时刻or至暗时刻 #
42193次浏览 221人参与
# 你听到的“最没用”的秋招建议 #
21281次浏览 234人参与
# 如果今天是你的last day,你会怎么度过? #
48393次浏览 299人参与
# 面试被问期望薪资时该如何回答 #
312108次浏览 1790人参与
# 2025秋招体验点评 #
48012次浏览 484人参与
# 除了主业以外,你还有哪些其他收入? #
35499次浏览 302人参与
# 在国企工作的人,躺平了吗? #
375765次浏览 3930人参与
