广联达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#
全部评论
第一题不知道为什么显示超时了 代码几乎一样
点赞 回复 分享
发布于 2023-09-10 14:51 陕西

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
3
22
分享
牛客网
牛客企业服务