前言:

  • 牛客小白89老黑月赛
  • 懒得补题了,就这样把

A - 伊甸之花

思路:

  • 只要能让数组a[]的每个元素整体向下或向上移动,那么就有合法数组b[]
  • 所以只需要判断:
  • a[]数组中的最大值是否到达上界
  • a[]数组中的最小值是否到达下界
    • 符合以上两种情况均不合法,输出No 否则输出 Yes

以下是代码部分

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

void solve()
{
    int n, m, maxn = 0, minx = 1e7;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        int a;
        cin >> a;
        maxn = max(maxn, a);
        minx = min(minx, a);
    }
    if(minx == 1 && maxn == m)
        cout << "No\n";
    else cout << "Yes\n";
}

int main()
{
    ios::sync_with_stdio(false);
    int t = 1;
    while(t --)
        solve();

    return 0;
}

B - 显生之宙

思路:

  • 这题最最最需要注意的就是题目里的再选择数列中的至少一个其他数
  • 注意到这个之后,就是普通的贪心做法了。
  • 先从小到大按升序排列,然后分情况讨论:
  • 如果选取的x为负数,那么给每个数都加上
  • 如果选取的x为非负数,则只给最后一个数加上即可

以下是代码部分

#include<bits/stdc++.h>
using namespace std;

using ll = long long;
const int N = 5e5 + 10;
ll a[N];

void solve()
{
    int n;
    cin >> n;
  //输入
    for(int i = 1; i <= n; i ++) cin >> a[i];
  //从小到大排序
    sort(a + 1, a + n + 1);
    ll sum = 0;
    for(int i = 1; i < n; i ++)
    {
      //如果是负数,则使每个数+x
        if(sum + a[i] < 0)
        {
            a[i] += sum;
            sum += a[i];
        }
      //否则,只让最后一个数+x
        else
        {
            a[i] += sum;
            a[n] += a[i];
        }
    }
    a[n] += sum;
    cout << a[n] << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while(t --)
        solve();

    return 0;
}

C - 太阳之华

思路:

  • 易得结论:

    1. 当一开始全是蓝色,那么就使蓝色获胜, 输出:Blue

    2.当一开始可以让红色获胜,则必定是红色获胜, 输出:Red

    3.当一开始红色不能获胜,则必定平局。输出:Draw

以下是代码部分——BFS做法:

以下是代码部分——DFS做法: