前言:
- 牛客
小白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 - 太阳之华
思路:
-
易得结论:
- 当一开始全是蓝色,那么就使蓝色获胜, 输出:
Blue
。
2.当一开始可以让红色获胜,则必定是红色获胜, 输出:
Red
。3.当一开始红色不能获胜,则必定平局。输出:
Draw
。 - 当一开始全是蓝色,那么就使蓝色获胜, 输出:
以下是代码部分——BFS做法:
以下是代码部分——DFS做法: