C++刷题--编程题

本文包含五道编程题目及其解题思路,涉及数组操作、字符串处理和序列划分。题目涵盖组队竞赛的最值问题、排序子序列的划分、倒置字符串的方法、统计回文子串以及求连续最大和的算法。每道题目的解法都提供了C++实现。
摘要由CSDN通过智能技术生成

题目1–组队竞赛

牛客–组队竞赛

解题思路 : 我们只要每次去掉数组中最大和最小的值,然后取出其中第二大的值即可
1, 先对数组进行排升序
2, 然后从左和右一起遍历数组,每次: 取出a[right -1 ] , 然后left++,, right -= 2;

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    vector<int> v(3 * n, 0);

    for (int i = 0; i < 3 * n; i++)
        cin >> v[i];

    sort(v.begin(), v.end());
    int left = 0, right = 3 * n - 1;

    long long ans = 0;
    while (left < right)
    {
        ans += v[right - 1];
        right -= 2;
        left++;
    }

    cout << ans << endl;
    return 0;
}

题目2–排序子序列

题目连接

解题思路: 理解题目有些困难, 但是大致意思就是划分最少的子序列, 子序列可以递增,递减, 可以出现相等的的数字!!
详情见注释

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

int main()
{
    int n = 0,count = 0;
    cin >> n;
    vector<int> v(n, 0);
    
    for(int i = 0; i < n; i++)
        cin >> v[i];

    int i = 0;
    while(i < v.size() - 1)   //控制下标边界
    {
         if(v[i] < v[i+1])  //这里不能添加等于 防止的是  8 8 5 4 
         {
            while(i < v.size() - 1 && v[i] <= v[i + 1])  //这是统计了一个递增子序列  如  1 2 3 3 5 5 8
                i++;
            
            i++;
            count++;
         }
         else if(v[i] == v[i+1])   
         {
             i++;
         }
         else
         {
             while(i < v.size() - 1 && v[i] >= v[i + 1])
                i++;
             
             i++;
             count++;
         }
    }
    
    if(i == v.size() - 1)
       count++;

    cout << count << endl;
    return 0;
}

题目3 – 牛客OR62 倒置字符串

题目连接

解题思路 :
1, 先对每一个单词进行逆置, 先标记每个单词的开头, 然后遇到空格, 逆置这个单词
2, 整体逆置

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


int main()
{
    string str;
    getline(cin, str);   // cin >> str不会读到空格
    
    int start = 0;
    for(int i = 0; i < str.size(); i++)
    {
        if(str[i] == ' ')
        {
            reverse(str.begin() + start, str.begin() + i);
            start =  i + 1;
        }

        if(i == str.size() - 1)
            reverse(str.begin() + start, str.end());
           
    }

    reverse(str.begin(), str.end());
    cout << str << endl;

    return 0;
}

题目4 – 牛客WY18 统计回文

解题思路 : 题目非常简单 ,直接无脑暴力操作即可。

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


bool isPal(string str)
{
    int left = 0, right = str.size() - 1;
    while (left < right)
    {
        if (str[left] != str[right])
            return false;

        left++;
        right--;
    }

    return true;
}


int main()
{
    string str1, str2;
    cin >> str1 >> str2;


    int ount = 0;
    for (int i = 0; i <= str1.size(); i++)
    {
        string tmp = str1;
        if (isPal(tmp.insert(i, str2)))
            count++;
    }


    cout << count << endl;
    return 0;
}

题目5–DD1 连续最大和

解题思路 : 累加,加到负数置回0即可

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;

    vector<int> v(n, 0);
    for (int i = 0; i < n; i++)
        cin >> v[i];

    int answer = INT_MIN;
    int tmp = 0;
    for (int i = 0; i < v.size(); i++)
    {
        tmp += v[i];
        answer = max(answer, tmp);

        if (tmp < 0)
            tmp = 0;
    }

    cout << answer << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通过全部用例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值