【牛客刷题】笔记1
目录
1、数组中两个字符串的最小距离
2、dd爱框框
3、除2!
1、数组中两个字符串的最小距离
数组中两个字符串的最小距离_牛客题霸_牛客网 (nowcoder.com)
我们可以使用一个i来遍历数组,并用prev1来记录字符串1在上一次出现的下标,prev2记录字符串2在上一次出现的下标,prev1和prev2都初始化为-1,因为最先开始还每遍历,并不知道第一个字符串1和第一个字符串2在哪里。当i指向的值是prev1时,计算一下i到prev2的距离,并与ans取小,再将prev1的值改成i,当i指向的值是prev2时也是同理。
#include <iostream>
#include <string>
using namespace std;
int main() {
int n; cin >> n;
string str1, str2; cin >> str1 >> str2;
int ans = 0x3f3f3f3f, prev1 = -1, prev2 = -1;
for(int i = 0;i < n;i++)
{
string str; cin >> str;
if(str == str1)
{
if(prev2 != -1) ans = min(ans, i - prev2);
prev1 = i;
}
else if(str == str2)
{
if(prev1 != -1) ans = min(ans, i - prev1);
prev2 = i;
}
}
if(ans == 0x3f3f3f3f) cout << -1 << endl;
else cout << ans << endl;
return 0;
}
2、dd爱框框
dd爱框框 (nowcoder.com)
这道题就是使用滑动窗口。当窗口中值的和小于x时,入窗口。当窗口中的值大于等于x时,先更新结果,再出窗口,直到窗口中的值小于x,出窗口完毕,再继续入窗口。为了将区间长度与区间左右端点对应起来,我们可以使用unoredered_map
#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int N = 1e7 + 10;
int n, x, a[N];
int main() {
unordered_map<int, pair<int, int>> up;
scanf("%d%d", &n, &x);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]); // 注意:下标是从1开始的
int l = 1, r = 1, sum = 0, m = 0x3f3f3f3f;
while (r <= n)
{
while (r <= n && sum < x) sum += a[r++]; // 入窗口
while (l <= r && sum >= x) // 出窗口
{
m = min(m, r - l); // m用来存储mp中的最小值
if (!up.count(r - l)) up[r - l] = { l, r - 1 }; // 若没有则加入
sum -= a[l++];
}
}
// cout << up[m].first << " " << up[m].second << endl;
printf("%d %d\n", up[m].first, up[m].second);
return 0;
}
3、除2!
除2! (nowcoder.com)
这道题很明显就是每次将数组中最大的偶数除以2,直到数组中没有偶数了,或者已经进行了k次操作。所以,我们使用一个大根堆来存储数组中的偶数,而奇数不放入大根堆,我们开一个sum来存储奇数。注意,这个sum一定要是long long类型的,因为有1e5个数,而每个数的最大值是1e9。每次操作,取出堆顶的元素,将其除以2,若结果是偶数,则再放回堆,若结果是奇数,则加入sum。直到进行了k次操作或者还没进行k次操作堆中就已经没有元素了,若是进行了k次操作结束的,堆中可能还有元素,最后需要将这些元素加入sum。最终sum就是结果
#include <iostream>
#include <queue>
using namespace std;
int n, k;
int main() {
long long sum = 0;
priority_queue<int> pq;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
int x; cin >> x;
if (x % 2 == 1) sum += x;
else pq.push(x);
}
while (k-- && !pq.empty())
{
int x = pq.top(); pq.pop();
if ((x / 2) % 2 == 1) sum += (x / 2);
else pq.push(x / 2);
}
while (!pq.empty())
{
sum += pq.top(); pq.pop();
}
printf("%lld\n", sum);
return 0;
}