字节跳动 c++ 笔试题 2020-04-12

A题
给俩数组a和b,然后能给a的连续一段加上一个数,问能否让a变成b
模拟题意,别漏情况
#include<bits/stdc++.h>
#define LL long long
#define maxn 100010
using namespace std;

int a[maxn], b[maxn];

int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		int n;
		scanf("%d", &n);
		for(int i = 0; i < n; ++i){
			scanf("%d", &a[i]);	
		}
		for(int i = 0; i < n; ++i){
			scanf("%d", &b[i]);
		}
		int l = 0, r = n, t = 2;
		bool ok = true;
		for(int i = 1; i < n; ++i){
			if((a[i] - b[i]) - (a[i - 1] - b[i - 1]) != 0){
				if(t == 2){
					l = i;
					t--;
				}
				else if(t == 1){
					r = i;
					t--;
				}
				else{
					ok = false;
				}
			}
		}
		//cout << l << " " << r << endl;
		int ch = b[l] - a[l];
		for(int i = l; i < r; ++i){
			a[i] = a[i] + ch;
		}
		for(int i = 0; i < n; ++i){
			if(a[i] != b[i]){
				ok = false;
			}
		}
		printf(ok ? "YES\n" : "NO\n");
	}
	return 0;
} 

B题
有一排木条,各自有长度,每根木条可以拆成长度和为原木条长度的两段,问你让它们单调不减的最小拆分次数
从前往后记录最小值,挺良心的,不用二分也能过
#include<bits/stdc++.h>
#define LL long long
#define maxn 3010
#define INF 0x3f3f3f3f
using namespace std;

int a[maxn];

int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; ++i){
		scanf("%d", &a[i]);
	}
	int ans = 0;
	int mi = INF;
	for(int i = n - 1; i >= 0; --i){
		mi = min(a[i], mi);
		if(a[i] > mi){
			double d = 2;
			while(ceil(a[i] / d) > mi){
				d++;
			}
			ans = ans + d - 1;
			mi = min(mi, int(floor(a[i] / d)));
		}
	}
	printf("%d\n", ans);
	return 0;
} 

C题
有一堆优惠券a,商品b,如果bi>=aj的话bi可以被优惠aj元,aj永远不会消失,问最少花费
二分裸题,找ai中第一个小于等于bi的值
#include<bits/stdc++.h>
#define LL long long
#define maxn 3010
#define INF 0x3f3f3f3f
using namespace std;

int a[maxn], b[maxn];

int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < n; ++i){
		scanf("%d", &a[i]);
	}
	for(int i = 0; i < m; ++i){
		scanf("%d", &b[i]);
	}
	sort(a, a + n);
	LL sum = 0;
	for(int i = 0; i < m; ++i){
		int p = upper_bound(a, a + n, b[i]) - a;
		sum = sum + b[i] - a[p - 1];
	}
	printf("%lld\n", sum);
	return 0;
} 

D题
有一排楼房,向左看最远会被比自己高的楼挡住,向右看一样,问每个楼最远能看到多少楼
单调栈裸题,两遍记录答案就行了
#include<bits/stdc++.h>
#define LL long long
#define maxn 100010
#define INF 0x3f3f3f3f
using namespace std;

int a[maxn], ans[maxn];

stack<int> st;

/* 
1
4
1 4 3 3
*/

int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		int n;
		scanf("%d", &n);
		for(int i = 0; i < n; ++i){
			scanf("%d", &a[i]);
		}
		memset(ans, 0, sizeof ans);
		while(!st.empty()){
			st.pop();
		}
		for(int i = 0; i < n; ++i){
			if(st.empty() || a[i] < a[st.top()]){
				st.push(i);
			}
			else{
				while(!st.empty() && a[i] >= a[st.top()]){
					st.pop();
				}
				if(st.empty()){
					ans[i] = ans[i] + i;
				}
				else{
					ans[i] = ans[i] + i - st.top() - 1;
				}
				st.push(i);
			}
		}
		while(!st.empty()){
			st.pop();
		}
		for(int i = n - 1; i >= 0; --i){
			if(st.empty() || a[i] < a[st.top()]){
				st.push(i);
			}
			else{
				while(!st.empty() && a[i] >= a[st.top()]){
					st.pop();
				}
				if(st.empty()){
					ans[i] = ans[i] + n - i - 1;
				}
				else{
					ans[i] = ans[i] + st.top() - i - 1;
				}
				st.push(i);
			}
		}
		for(int i = 0; i < n; ++i){
			printf("%d ", ans[i]);
		}
		printf("\n");
	}
	return 0;
} 


用了大概一个小时,这场的题还是蛮简单的,比阿里笔试题简单一个档次
#字节跳动春招##字节跳动##笔试题目#
全部评论
大佬问一下,那个优惠券的问题。为什么在这两种特殊情况输出有误:①当前没有一张优惠可以用(即全部大于当前商品价格)②当前所有优惠券小于最小的商品的价格。我看其他人的答案在这两种特殊情况都输出有误,是题目不会出现这两种情况吗?
点赞 回复 分享
发布于 2020-04-15 11:39

相关推荐

今天 17:51
南昌大学 Java
点赞 评论 收藏
分享
4 27 评论
分享
牛客网
牛客企业服务