Codeforces Round #619 (Div. 2)

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

你可能感兴趣的:(Codeforces之旅)