小红书笔试AK7.23
第一题签到
第二题,题目讲的有点模糊,很容易让人读不懂题,大致就是给你多个不重叠的区间,然后你需要选择一个长度为k的连续区间,使其中被标记的空间数量最大。解法:二分搜索
第三题,题目意思大致就是给定一个数组与一个数字val,你可以任意的讲数组中的一个值替换成val,求最大连续子数组和。解法:dp,存储数组中每个下标的状态,0代表到这个位置还没有替换,1代表已经替换过一次,从而推导状态转移方程。
题目挺有意思的,整体难度不大,就是第二题题目描述不是很清楚。
//第一题 #include <iostream> #include <cmath> #include <algorithm> #define ll long long using namespace std; int main(){ ll n,k; cin>>n>>k; ll ans=n*(n+1)/2; ans=ans*k; cout<<ans<<endl; } //第三题 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define ll long long using namespace std; const int N = 2e5+5; ll k[N]; ll dp[N][2]; int main(){ int T; cin>>T; while(T--){ memset(dp,0,sizeof(dp)); ll n,val; ll ans=-10000000009; cin>>n>>val; for(int i=0;i<n;i++){ cin>>k[i]; } dp[0][0]=k[0]; dp[0][1]=val; ans=max(ans,dp[0][1]); ans=max(ans,dp[0][0]); for(int i=1;i<n;i++){ dp[i][1]=max(max(dp[i-1][1]+k[i],k[i]),max(dp[i-1][0]+val,val)); dp[i][0]=max(dp[i-1][0]+k[i],k[i]); ans=max(ans,dp[i][1]); ans=max(ans,dp[i][0]); } cout<<ans<<endl; } } //第二题 #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #define ll long long using namespace std; const int N = 1e5+5; struct kk{ ll bepos; ll enpos; ll val; ll sum; }Mess[N]; bool cmp(kk a,kk b){ return a.bepos<b.bepos; } ll erfen(ll low,ll high,ll aim){ ll mid=(low+high)/2; while(low<high){ ll x=Mess[mid].enpos; if(x>=aim){ high=mid; }else{ low=mid+1; } mid=(low+high)/2; } return high; } int main(){ ll n,m,k; cin>>n>>m>>k; Mess[0].sum=0; for(int i=1;i<=m;i++){ cin>>Mess[i].bepos>>Mess[i].enpos; Mess[i].val=Mess[i].enpos-Mess[i].bepos; Mess[i].sum=Mess[i-1].sum+Mess[i].val; } Mess[m+1].bepos=n+1; Mess[m+1].enpos=n+1; Mess[m+1].sum=Mess[m].sum; sort(Mess+1,Mess+1+m,cmp); // for(int i=1;i<=m+1;i++){ // cout<<Mess[i].bepos<<' '<<Mess[i].enpos<<endl; // } ll ans=0; for(int i=1;i<=m;i++){ ll vals=0; int be=Mess[i].bepos; int en=Mess[i].bepos+k; // cout<<be<<' '<<en<<" message"<<endl; if(en>=n){ vals=Mess[m].sum-Mess[i-1].sum; }else{ int nextindex=erfen(i,m+1,en); vals=Mess[nextindex-1].sum-Mess[i-1].sum; if(en>Mess[nextindex].bepos){ vals+=en-Mess[nextindex].bepos; } // cout<<"index: "<<nextindex<<endl; // cout<<nextindex<<endl; } ans=max(ans,vals); } cout<<ans<<endl; }