关注
/*这谁把坟贴都挖出来了正好看到就写一下了,求个能交题的地址,我不知道写的对不对
以下是代码
*/
// 第三题是个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);
}
查看原帖
点赞 评论
相关推荐
04-21 09:11
河海大学 嵌入式工程师 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我的实习收获 #
24591次浏览 427人参与
# 在国企工作的人,躺平了吗? #
333192次浏览 3862人参与
# 实习吐槽大会 #
26356次浏览 127人参与
# 商战,最累的是我们 #
12732次浏览 50人参与
# 晒一晒你的工位 #
84209次浏览 299人参与
# 我的租房踩坑经历 #
20339次浏览 237人参与
# 穿越回高考你还会选现在的专业吗 #
18132次浏览 235人参与
# 毕业旅行去哪玩儿 #
987次浏览 29人参与
# 小厂实习有必要去吗 #
46379次浏览 267人参与
# 求职你最看重什么? #
69531次浏览 393人参与
# 牛友们,签完三方你在忙什么? #
94888次浏览 837人参与
# 夸夸我的求职搭子 #
190765次浏览 1890人参与
# 摸鱼打卡站 #
39302次浏览 687人参与
# 携程求职进展汇总 #
530119次浏览 3949人参与
# 产运销实习日记 #
51953次浏览 551人参与
# 打工人锐评公司红黑榜 #
145337次浏览 908人参与
# 网易求职进展汇总 #
101820次浏览 982人参与
# 你小时候最想从事什么职业 #
95470次浏览 1719人参与
# 作业帮求职进展汇总 #
52416次浏览 354人参与
# 高学历就一定能找到好工作吗? #
47542次浏览 589人参与