关注
/*这谁把坟贴都挖出来了正好看到就写一下了,求个能交题的地址,我不知道写的对不对
以下是代码
*/
// 第三题是个01背包 ,我应该写不出来 朋友一眼秒的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int x[110],y[110];
unordered_map<int,ll> mp[2];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
mp[0][0]=0;
for(int i=1;i<=n;i++){
int now=i%2;
mp[now].clear();
for(auto j=mp[1-now].begin();j!=mp[1-now].end();++j){
mp[now][j->first+x[i]]=max(mp[now][j->first+x[i]],j->second+y[i]);
mp[now][j->first-x[i]]=max(mp[now][j->first-x[i]],j->second+y[i]);
mp[now][j->first]=max(mp[now][j->first],j->second);
}
}
cout<<max(mp[0][0],mp[1][0])<<endl;
return 0;
}
//
第四题比较简单 栈的经典操作 我们预处理a数组 以ai为最大值的 左右区间长度 l[i],r[i]
b数组 以bi 为最小值的左右区间长度 L[i],R[i]
最后遍历一下数组 复杂度O(n)?
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int a[maxn],b[maxn];
int l[maxn],r[maxn],L[maxn],R[maxn];
int st[maxn],n,len;
void init1(int c[]){
memset(st,0,sizeof(st));
len=0;
for(int j=1;j<=n;j++){
while(c[st[len]]<c[j]&&len>0) len--;
if(len==0) l[j]=1;
else l[j]=st[len]+1;
st[++len]=j;
}
len=0;
for(int j=n;j>=1;j--){
while(c[st[len]]<c[j]&&len>0) len--;
if(len==0) r[j]=n;
else r[j]=st[len]-1;
st[++len]=j;
}
}
void init2(int c[]){
memset(st,0,sizeof(st));
len=0;
for(int j=1;j<=n;j++){
while(c[st[len]]>c[j]&&len>0) len--;
if(len==0) L[j]=1;
else L[j]=st[len]+1;
st[++len]=j;
}
len=0;
for(int j=n;j>=1;j--){
while(c[st[len]]>c[j]&&len>0) len--;
if(len==0) R[j]=n;
else R[j]=st[len]-1;
st[++len]=j;
}
}
int main(){
cin>>n;
for(int j=1;j<=n;j++){
scanf("%d",&a[j]);
}
for(int j=1;j<=n;j++){
scanf("%d",&b[j]);
}
init1(a);
init2(b);
int ans=0;
for(int j=1;j<=n;j++){
int mi=min(R[j],r[j]);
int mx=max(l[j],L[j]);
ans+=mi-mx+1;
}
printf("%d\n",ans);
}
// 第五题 就是个经典的贪心问题
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
vector<pii>q;
bool cmp(pii a,pii b){
if(a.first==b.first) return a.second<b.second;
return a.first<b.first;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int j=1;j<=n;j++){
int s,t;
scanf("%d%d",&s,&t);
q.push_back(pii(s,t));
}
sort(q.begin(),q.end(),cmp);
int ans=1,en=q[0].second;
if(en>m) ans--;
for(int j=1;j<n;j++){
if(q[j].second>m) break;
if(q[j].first>=en) ans++,en=q[j].second;
}
printf("%d\n",ans);
}
查看原帖
点赞 评论
相关推荐
昨天 15:43
黑龙江外国语学院 Java 点赞 评论 收藏
分享
昨天 17:26
河南理工大学 底盘工程师 点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我的实习收获 #
29227次浏览 492人参与
# 非技术岗简历怎么写 #
209641次浏览 2859人参与
# 实习吐槽大会 #
30549次浏览 146人参与
# 如果有时光机,你最想去到哪个年纪? #
46991次浏览 799人参与
# 晒一晒你的工位 #
85486次浏览 303人参与
# 26届秋招投递记录 #
3374次浏览 100人参与
# 2025牛客秋招季 #
3426次浏览 105人参与
# 双非能在秋招上岸吗? #
215085次浏览 1142人参与
# 被AI治愈的瞬间 #
52262次浏览 597人参与
# 怎么防止在试用期被辞退 #
122279次浏览 911人参与
# 我的租房踩坑经历 #
26346次浏览 277人参与
# 穿越回高考你还会选现在的专业吗 #
20965次浏览 264人参与
# 打工人的工作餐日常 #
40401次浏览 343人参与
# 软开人,说说你的烦心事 #
48050次浏览 359人参与
# 毕业旅行去哪玩儿 #
1199次浏览 32人参与
# 硬件/芯片公司工作体验 #
75143次浏览 664人参与
# 我和mentor的爱恨情仇 #
43172次浏览 274人参与
# 25届秋招公司红黑榜 #
262122次浏览 1094人参与
# 打工人锐评公司红黑榜 #
145813次浏览 917人参与
# 商战,最累的是我们 #
12985次浏览 52人参与