第一题:可以直接暴力
#include<iostream>
using namespace std;
int main()
{
int n, a, b[105], ans = 0;
cin >> n >> a;
for (int i = 0; i < n; i++)
{
cin >> b[i];
}
for (int i = 1; i < n; i++)
{
if (b[i - 1] < a && b[i] >= a)
ans++;
}
cout << ans;
return 0;
}
第二题:
#include<iostream>
using namespace std;
string s;
int ans = 0;
bool fun(char a, char b)
{
if (a == b)
return true;
return false;
}
int main()
{
cin >> s;
if (s.size() < 3)
{
cout << -1;
return 0;
}
for (int i = 0; i < s.size(); i++)
{
string t = s;
for (char x = 'a'; x <= 'z'; x++)
{
t[i] = x;
int sum = 0;
for (int j = 0; j < s.size()-2; j++)
{
if (fun(t[j], t[j + 2]))
sum++;
}
ans = max(ans, sum);
}
}
cout << ans;
}
第三题:
答案
#include<iostream>
using namespace std;
//这个交换数组呢有几种情况
//1. 1 2 2 是前头交换,只有一种
//2. 1 3 2 尾部交换,只有一种(因为这个记录位置会记录到前一个数,所以要单独判断)
//3. 1 2 2 3 5中部交换 ,必然有两个非质数
//所以我们要保存发生交换的地方进行判断
int n, a[100005];
bool isFunc(int x)
{
if (x > 3 && x % 2 == 0)
return true;
return false;
}
int main()
{
int ans = 0, pos[4];
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
if (n < 3)
{
cout << -1;
return 0;
}
for (int i = 1; i <= n - 2; i++)
{
int sum = a[i] + a[i + 1];
if (isFunc(sum))
{
pos[ans] = i; //找到之后保存位置(后面用于判断是不是中部交换)
ans++;
}
if (ans > 2) //两种以上就直接输出结束
{
cout << -1;
return 0;
}
}
if (isFunc(a[n - 1] + a[n])) //尾部单独判断
{
ans++;
if (ans == 1)
{
cout << n - 2;
return 0;
}
}
if (ans == 1)
{
cout << pos[0] + 1;
}
else if (ans == 2 && pos[1] - pos[0] <= 2) //相邻距离小于2就是中部交换了一次
{
cout << pos[0] + 1;
}
else
cout << -1;
return 0;
}