腾讯笔试 90 100 0 100 40,求3,5题的解法
第一题
只需看0 到 n-11 有没有8即可,看别的帖,只通过90%好像是因为题目测试用例本身有错误
#include <bits/stdc++.h>
using namespace std;
int main() {
int t = 0;
cin >> t;
for (int i = 0; i < t; i++) {
int n = 0;
cin >> n;
string s;
cin >> s;
bool valid = false;
for (int j = 0; j <= n - 11; j++) {
if (s[j] == '8') {
valid = true;
break;
}
}
if (valid) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}第二题
整个排序,然后每次两两取首尾求和,求最大值
一开始直接一个vector存所有的延时时间,结果提交发现超内存了。
所以还是直接存 x, y, 然后再遍历
#include <bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<pair<int, int>> delay(n);
int total = 0;
for (int i = 0; i < n; i++) {
cin >> delay[i].first >> delay[i].second;
total += delay[i].first;
}
auto cmp = [](const pair<int, int>& x, const pair<int, int>& y) {
return x.second < y.second;
};
sort(delay.begin(), delay.end(), cmp);
int minCost = 0;
int i = 0;
int j = delay.size() - 1;
int count = 0;
while (count < total) {
if (delay[i].first == 0) {
i++;
}
if (delay[j].first == 0) {
j--;
}
minCost = max(minCost, delay[i].second + delay[j].second);
delay[i].first--;
delay[j].first--;
count += 2;
}
cout << minCost << endl;
return 0;
}第四题
只要记录每次输出x的和sumX,然后与sumX相等的数直接略过就可以了,我用了小根堆,实际上直接vector存,然后排序,再遍历就可以了
#include <bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
int k = 0;
cin >> n >> k;
priority_queue<int, vector<int>, greater<int>> minHeap;
for (int i = 0; i < n; i++) {
int number = 0;
cin >> number;
minHeap.push(number);
}
int sumX = 0;
for (int i = 0; i < k; i++) {
while (!minHeap.empty() && minHeap.top() == sumX) {
minHeap.pop();
}
if (minHeap.empty()) {
cout << 0 << endl;
} else {
cout << minHeap.top() - sumX << endl;
sumX = minHeap.top();
}
}
return 0;
}第五题
完全暴力解的,过了40%
感觉腾讯的题还算友好吧,毕竟这是我这么多笔试以来做的最好的一次了。。。
求第三题、第五题解法
#笔试题目##腾讯#
