蓝桥杯练习(部分)1

蓝桥杯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;          //定义全局变量s 
 
bool checkA(int i, int len){
    
            //判断是否为Alice, i为下标, 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){
    
                //判断是否为Bob, i为下标, len为字符串长度 
    if(len - i < 3)  return false;
    return s[i+1] == 'o' && s[i+2] == 'b';
}
 
int main(){
    
    
    int k;         //定义k 
    cin >> k;       //输入k 
    getchar();      //吃回车 
     
    getline(cin, s);       //整行输入字符串s 
    int len = s.length();    //定义len为s的长度 
 
    vector<int> Alice, Bob;     //定义数组记录名字出现时的下标 
 
    for(int i = 0; i < len; i++){
    
             //遍历字符串 
        if(s[i] == 'A' && checkA(i, len)){
    
     //如果字符为'A'判断是否为Alice 
            Alice.push_back(i);             //添加下标到数组 
            i += 5;               //跳过名字(名字后后空格,无需担心循环中的i++)
        }
        else if(s[i] == 'B' && checkB(i, len)){
    
       //如果字符为'B'判断是否为Bob 
            Bob.push_back(i);                   //添加下标到数组 
            i += 3;               //跳过名字
        }
    }
 
    int As = Alice.size(), Bs = Bob.size();       //As与Bs分别为两数组元素个数 
    int bl = 0, br = 0;           //bl与br分别为窗口左右边界 
     
    long long ans = 0;          //定义答案(最后一个评测点会超过int范围) 
     
    for(int i = 0; i < As; i++){
    
      //遍历Alice数组元素 
        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;
}

猜你喜欢

转载自blog.csdn.net/foolbirdM/article/details/123472143
今日推荐