题目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;
}