1.简写单词
题目来源: 简写单词——牛客网
测试用例
算法原理
本题的主要难点就是如何识别每一个单词并且返回其首字母大写,最终组成一个新的字符串后输出,这里我们使用while(cin>>str)就可以解决,直接忽略每一个空格直接读入字符串
1.直接读入字符串后判断字符串首字母str[0]是否为大写字母,如果为小写字母则需要(char)(s[0]-32)来强制转化为大写字母,最后返回即可,属于简单类型建议直接秒杀
实战演练
#include<iostream>
#include<string>
using namespace std;int main()
{string str;while(cin>>str){//小写字母需要转换if(str[0] >= 'a' && str[0] <= 'z'){cout<<(char)(str[0] - 32);}else{cout<<str[0];}}return 0;
}
2.dd爱框框
题目来源: dd爱框框——牛客网
测试用例
算法原理
本题的核心思路就是"滑动窗口",也就是同向双指针的原理,即使用left与right两个同向移动的指针来模拟一个虚拟的滑动窗口,保证窗口内的元素符合条件,然后返回需要的数据
1.首先向右移动right指针入窗口,直到窗口内元素之和>=x,然后更新此时的左右指针
2.然后开始右移left指针出窗口,如果窗口内元素<x,就再次右移right指针,继续更新左右指针即可,直到遍历完整个数组
注意:题目要求数组从下标为1开始,所以输入时需要注意
实战演练
#include<iostream>using namespace std;const int N = 1e7 + 10;
int arr[N];
int n,x;int main()
{cin>>n>>x;for(int i = 1;i <= n;i++){cin>>arr[i];}int len = N;int lenleft = -1,lenright = -1;int left = 0,right = 0;int sum = 0;while(right <= n){//入窗口sum += arr[right];while(sum >= x){//更新结果if(len > right - left + 1){len = right - left + 1;lenleft = left;lenright = right;}//出窗口sum -= arr[left++];}//继续入窗口right++;}cout<<lenleft<<" "<<lenright<<endl;return 0;
}
3.除2!
题目来源: 除2!——牛客网
测试用例
算法原理
本题的解决思路是使用优先级队列默认升序来对待操作数中的最大偶数进行运算
1.首先计算原来所以待操作数的总和,这里使用一个变量x来不断输入,不使用数组,更加简单,同时判断输入的数字是否为偶数,是则插入到优先级队列中
2.取出优先级队列中的顶部元素,因为默认升序排列,所以顶部元素就是最大偶数,此时将原来的总和减去该最大偶数的一半,然后将该偶数从优先级队列中删除,同时判断该最大偶数除以2后是否仍然为偶数,是则再次插入优先级队列中进行后续操作,最后打印总和
注意:
1.这里操作进行的条件不止是k>0,还要保证优先级队列不为空,避免全为奇数的情况
2.本题的数据范围很大,所以需要使用long long类型来存储数据,这里直接使用typedef更加方便
实战演练
#include<iostream>
#include<queue>
using namespace std;
typedef long long LL;
priority_queue<LL> heap;
LL n,k;int main()
{cin>>n>>k;LL sum = 0,x;//不额外开辟新的数组,创建变量x实时输入数据for(int i = 0;i < n;i++){cin>>x;//统计数字之和sum += x;//将所有偶数存入优先级队列,默认升序排列if(x % 2 == 0){heap.push(x);}}//当优先级队列不为空且k不为0时运行程序//避免待操作数中全是奇数while(!heap.empty() && k--){//取出最大的偶数并从优先级队列删除LL t = heap.top() / 2;heap.pop();//将原来的和减去最大偶数的一半sum -= t;//如果最大偶数减去一般仍然为偶数//则继续插入到优先级队列中进行后续操作if(t % 2 == 0){heap.push(t);}}cout<<sum<<endl;return 0;
}