頭條4.12筆試

 

第一題

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main() {
	int T;
	cin >> T; 
	for (int i = 0; i < T; i++) {

		int n;
		cin >> n;
		vector<int> a(n, 0);
		vector<int> b(n, 0);
		vector<int> help(n, 0);
		for (int i = 0; i < n; i++) {
			cin >> a[i];
		}
		for (int i = 0; i < n; i++) {
			cin >> b[i];
		}

		for (int i = 0; i < n; i++) {
			if (a[i] != b[i]) {
				help[i] = 1;
			}
		}
		int start = -1;
		int end = -1;
		for (int i = 0; i < n; i++) {
			if (start == -1 && help[i] == 1) {
				start = i;//找到開頭的位置
				end = i;
				while (i + 1 < n && help[++i] == 1 && help[i] == help[i - 1]) {
					end = i;
				}
			}
		}
		int k = a[start] - b[start];
		int pEnd = -1;
		for (int i = n - 1; i >= 0; i--) {
			if (help[i] == 1) {
				pEnd = i;
				break;
			}
		}
		if (end != pEnd)
		{
			cout << "NO" << endl;
		}
		else {
			for (int i = start; i < end; i++) {
				if (a[i] - b[i] != k) {
					cout << "NO" << endl;
					break;
				}
			}
			cout << "YES" << endl;
		}

	}
}

 

第二題

int main() {
	int n;
	cin >> n;
	vector<int> arr(n,0);
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	int ans = 0;
	stack<int> st;
	for (int i = n - 1; i >= 0; i--) {
		if (!st.empty() && st.top() < arr[i]) {
			int t = (arr[i] - 1) / st.top();
			ans += t;
			st.push(arr[i] / (t + 1));
			continue;
		}
		st.push(arr[i]);
	}
	cout <<  ans << endl;
}

第三題

int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n, 0);
	vector<int> b(m, 0);

	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < m; i++) {
		cin >> b[i];
	}
	sort(a.begin(), a.end());
	sort(b.begin(), b.end());
	//上一個商品使用的優惠券
	int index = -1;
	int cost = 0;
	for (int i = 0; i < m; i++) {
		while (index + 1 < n && a[index + 1] <= b[i])
			index++;
		cost += (b[i] - a[index]);
	}
	cout << cost << endl;
}

 

第四題

int main() {
	//單調隊列問題
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		int n;
		cin >> n;
		vector<int> heights(n, 0);
		for (int i = 0; i < n; i++) {
			cin >> heights[i];
		}

		vector<int> res(n, 0);
		vector<int> left(n, 0);
		vector<int> right(n, 0);
		for (int i = n - 1; i >= 0; i--)
		{
			int j = i;
			while (j >= 0 && heights[i] >= heights[j]) {
				j--;
			}
			left[i] = j + 1;
		}

		for (int i = 0; i < n; i++) {
			int j = i;
			while (j < n && heights[i] >= heights[j]) {
				j++;
			}
			right[i] = j - 1;
		}

		for (int i = 0; i < n; i++) {
			cout << right[i] - left[i] << " ";
		}
		cout << endl;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章