题
蓝桥杯2019年第十届省赛真题-完全二叉树的权值
- 题目链接: https://www.dotcpp.com/oj/problem2299.html
- 没什么特别注意的地方,pop不会返回元素
- 某层个数:pow(2,i-1),总共个数:pow(2,deep)-1.
#include<bits/stdc++.h>
using namespace std;
int main()
{
queue<int> tree;
int N;
cin >> N;
for(int i = 0; i < N; i++)
{
int a;
cin >> a;
tree.push(a);
}
int deep = 1;
while(pow(2,deep)-1 < N) deep++;
int maxDeep = 1;
int maxSum = tree.front();
tree.pop();
for(int i = 2; i < deep; i++)
{
int sum = 0;
for(int j = 0; j < pow(2,i-1); j++)
{
sum += tree.front();
tree.pop();
}
if(maxSum < sum)
{
maxSum = sum;
maxDeep = i;
}
}
int sum = 0;
while(!tree.empty())
{
sum += tree.front();tree.pop();
}
if(maxSum < sum)
{
maxSum = sum;
maxDeep = deep;
}
cout << maxDeep << endl;
return 0;
}
蓝桥杯2019年第十届省赛真题-人物相关性分析
- 题目链接:https://www.dotcpp.com/oj/problem2309.html
- 滑动窗口算法,维护窗口左边与右边值
- getline(cin,mystr);读取一行,会读取换行,但不会放入字符串
#include <bits/stdc++.h>
using namespace std;
string s;
bool checkA(int i, int len){
if(len - i < 5) return false;
return s[i+1] == 'l' && s[i+2] == 'i' && s[i+3] == 'c' && s[i+4] == 'e';
}
bool checkB(int i, int len){
if(len - i < 3) return false;
return s[i+1] == 'o' && s[i+2] == 'b';
}
int main(){
int k;
cin >> k;
getchar();
getline(cin, s);
int len = s.length();
vector<int> Alice, Bob;
for(int i = 0; i < len; i++){
if(s[i] == 'A' && checkA(i, len)){
Alice.push_back(i);
i += 5;
}
else if(s[i] == 'B' && checkB(i, len)){
Bob.push_back(i);
i += 3;
}
}
int As = Alice.size(), Bs = Bob.size();
int bl = 0, br = 0;
long long ans = 0;
for(int i = 0; i < As; i++){
while(bl < Bs && Bob[bl] < Alice[i] - k - 3) bl++;
while(br < Bs && Bob[br] <= Alice[i] + k + 5) br++;
ans += br - bl;
}
cout << ans << endl;
return 0;
}