/*这谁把坟贴都挖出来了正好看到就写一下了,求个能交题的地址,我不知道写的对不对 以下是代码 */ // 第三题是个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); }
点赞 评论

相关推荐

求面试求offer啊啊啊啊:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务