A. Three Strings
思维题
题目大意:给你三个长度相等的字符串s1,s2,s3,现在要求你的每一位进行如下操作: i - s1用 i - s3 替换 或 i - s2 用 i - s3 替换。问进行完操作后能否使s1=s2;
解题思想: 如果能进行操作的话,每一位必有 i - s1 = i - s3 或 i - s2 = i - s3;因为,存在i - s1 = i - s3 或 i - s2 = i - s3的话,可以将对方串与s3进行替换,这样就使得s1=s2。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
bool flag = 0;
string s1, s2, s3;
cin >> s1 >> s2 >> s3;
for (int i = 0; i < s1.size(); ++i)
{
if (s1[i] == s3[i] || s2[i] == s3[i])
continue;
else
{
flag = 1;
break;
}
}
if (flag)
puts("NO");
else
puts("YES");
}
return 0;
}
B. Motarack’s Birthday
思维题
题目大意: 给你 n 个数num ,当 num = -1 时,用 k 进行替换;替换之后使得两个数之间的差的绝对值最大值k最小。
解题思想: 当 num = -1 时,则k会与-1前后两侧非-1的数相减,所以k的值受-1的前后两侧非-1的数所决定。要使m最小
定是所有 -1 的 前后两侧非-1数的 (最大数+最小数) / 2 ;这样才会使 (最大数 - k) 与 (k - 最小数) 的差值越接近。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const int maxn = 1e5 + 5;
int num[maxn];
int main()
{
ios::sync_with_stdio(false);
int t;
while (cin >> t)
{
while (t--)
{
int n;
memset(num, 0, sizeof(num));
vector<int> v;//将-1前后非-1的数放进数组
cin >> n;
int m = -1, k;
for (int i = 1; i <= n; i++)
cin >> num[i];
for (int i = 1; i <= n; i++)
{
if (num[i] != -1)
{
if (num[i - 1] == -1 || num[i + 1] == -1)//存数
v.push_back(num[i]);
}
}
if (!v.empty())
{
sort(v.begin(), v.end());
k = (v[0] + v[v.size() - 1]) / 2;//取最大数+最小数的平均数
}
else//若为空,则代表全为-1,则则是和,k随便取值,m都是0
k = 0;
for (int i = 1; i <= n; i++)
{
if (num[i] == -1)//替换
num[i] = k;
if (i == 1)
continue;
m = max(m, abs(num[i] - num[i - 1]));//判断差
}
cout << m << " " << k << endl;
}
}
return 0;
}
来源:CSDN
作者:nefu_马家沟老三
链接:https://blog.csdn.net/acm_durante/article/details/104358826