【笔试训练】简单写词|dd爱框框|除2!

发布于:2025-05-16 ⋅ 阅读:(165) ⋅ 点赞:(0)


1.简单写词

简单写词
在这里插入图片描述

思路:这道题思路非常简单,while(cin)循环输入每个单词,自动跳过空格,所以每次都只要判断单词的第一个字母是否是大写,如果是,则输出,如果是小写,则转成大写再输出即可。

#include <iostream>
#include <string>
using namespace std;

int main() {
    //以空格作为分割符
    string s;
    while(cin >> s)   //这里自动跳过空格,否则如果直接输入空格会直接停止。
    {
        if(s[0] >= 'a' && s[0] <= 'z')
            cout <<  (char)(s[0]  - 'a' + 'A');
        else 
            cout << s[0];
    }
    return 0;
}

2.dd爱框框

dd爱框框

在这里插入图片描述

思路:
这道题是一道典型的滑动窗口题目,只不过要注意一个细节问题:有效下标是从1开始的!!
这道题我一开始写的时候死活写不出来,看了题解才发现是下标问题。

滑动窗口四部曲:

  • 1.进窗口
  • 2.while/if判断要出窗口的条件
  • 3.出窗口
  • 4.更新结果(这个更新结果不一定是在最后一步进行,要看具体的题目,有可能是在任意位置更新结果)
//经典滑动窗口
//冯你个福的一开始写没注意到数组是从1开始的。
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n,x;
    cin >> n >> x;
    vector<int>arr(n+1,0);
    for(int i = 1;i <= n;i++)
        cin >> arr[i];
    int l = 1,r = 1;
    int sum = 0,len = 10000000;
    int flagl = 0;
    while(r <= n)
    {
        //1.进窗口
        sum += arr[r];
        while(sum >= x) //2.判断
        {
            //每次都更新结果,保证len最小,且l最小。
            if(r-l+1 < len)
            {
                flagl = l; //flagl就是最小的
                len = min(len,r - l + 1);
            }
            //出窗口
            sum -= arr[l++];
        }
        r++;
    }
    cout << flagl << " " << flagl + len - 1 << endl;
    return 0;
}

3.除2!

在这里插入图片描述
除2!

思路:
1.搞一个大根堆,一遍输入一边判断如果输入的元素为偶数,则进堆(奇数不进堆)
2.每次都取出堆顶元素(取了最大的偶数),进行/2操作,然后再判断/2后是否还是偶数,是的话再次进堆
3.循环进行,直到堆为空||操作了k次。
4.返回所有操作后的值即可。

#include <iostream>
#include <queue>

using namespace std;



int main()
{
    int n,k;
    cin >> n >> k;
    priority_queue<long long> heap;
    int i = 0;
    long long sum = 0; //统计所有被操作过和没被操作过的元素和
    while(i < n)
    {
        long long a;
        cin >> a;
        sum += a;
        if(a % 2 == 0)
            heap.push(a);
        
        i++;
    }
    
    while(heap.size() && k--)
    {
        long long t = heap.top();
        heap.pop();
        t /= 2;
        sum -= t; //该语句位置一定要放对
        if(t % 2 == 0)
            heap.push(t);
    }
    cout << sum << endl;
    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到