广联达9.6笔试
编程ak 第一题送外卖求最大利润:dp题,维护两个数组——dp,nextStart,dp[i]表示最后一单为第i单时的最大收益,nextStart[i]表示第i单结束后下一单最小开始时间,需要求和,数据用int会溢出;第二题翻转队列,使所有数一样:因为翻转只能使区间内左边与右边一致,所有最后的数字必然都是最右边的元素,假设为arr[n-1],找到从右往左第一个不等于arr[n-1]的数,模拟翻转过程就好,当不存在不一致的数就Ok了。下面附上两道题代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;cin>>n;
vector<int> s(n);
for(int i = 0;i < n;i++) cin>>s[i];
vector<int> t(n);
for(int i = 0;i < n;i++) cin>>t[i];
vector<int> a(n);
for(int i = 0;i < n;i++) cin>>a[i];
ll ans = INT_MIN;
vector<ll> dp(n);
vector<int> nextStart(n);
for(int i = 0;i < n;i++){
dp[i] = a[i];
nextStart[i] = s[i] + t[i];
for(int j = 0;j < i ;j++){
if(nextStart[j] <= s[i]){
dp[i] = max(dp[i],dp[j] + a[i]);
}
}
ans = max(ans,dp[i]);
}
cout<< ans <<endl;
//system("pause");
return 0;
}
#include<bits/stdc++.h>
using namespace std;int ans = 0;
int firstIdx(vector<int>& a,int r,int target){
int idx = r;
while(idx >= 0 && a[idx] == target){
idx--;
}
return idx;
}
int main(){
int n;
cin>>n;
vector<int> a(n);
for(int i = 0;i < n;i++) cin>>a[i];
int finalValue = a.back();
int r = n-2;
while(true){
int idx = firstIdx(a,r,finalValue);
if(idx < 0 ){
break;
}else{
ans++;
}
r = n - 2 * (n - idx - 1) - 1;
}
cout<< ans <<endl;
// system("pause");
return 0;
}
#笔试##广联达2024#