Codeforces Round 996 (Div. 2)
A. Two Frogs
题目大意:
给定一个数组和两个点i,j,每次i先向i移动一次,然后j向i移动一次,当某一点最后移动一次使另外一点无法移动时,此点胜,i胜输出'YES',j胜输出'NO'
大致思路:
经过模拟可知,如果i,j之间距离为奇数,i胜,偶数,j胜
代码
`#include<bits/stdc++.h>
using namespace std;
define int long long
define endl '\n'
const int N = 1e9 + 7;
void close() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
void solve() {
int n, a, b; cin >> n >> a >> b;
if (abs(a - b) % 2 == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
signed main() {
close();
int T = 1;
cin >> T;
while (T--) solve();
return 0;
}`
B - Crafting
题目大意:
给定两个数组a,b,有如下操作:选定a[i]使a[i]+1,a数组剩下的所有元素全部减一,问,能否通过操作使a数组的每个元素都大于等于b数组的相同下标元素
大致思路:
经过分析可得,如果a[i]小于b[i]的情况出现2次或2次以上,是不能通过操作完成要求的,如果a[i]小于b[i]的次数为0,直接输出'YES'即可,如果为1,将这两个的差值求出来,为t,分析每个a[i]大于b[i]的差值,如果最小的差值小于t,则输出'NO',否则输出'YES',如果两次以上,直接输出'NO'
代码:
`#include<bits/stdc++.h>
using namespace std;
define int long long
define endl '\n'
const int N = 200010;
void close() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
void solve() {
int n; cin >> n;
vector
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
int min1 = INT_MIN, min2 = INT_MAX;
int x = 0;
for (int i = 0; i < n; i++) {
if (x == 2)break;
if (a[i] < b[i]) {
min1 = b[i] - a[i];
x++;
}
else {
min2 = min(min2, a[i] - b[i]);
}
}
if (x == 0) {
cout << "YES" << endl;
return;
}
if (x == 2) {
cout << "NO" << endl;
return;
}
if (x == 1) {
if (min1 > min2) {
cout << "NO" << endl;
}
else {
cout << "YES" << endl;
}
}
}
signed main() {
close();
int T = 1;
cin >> T;
while (T--) solve();
return 0;
}`
C. The Trail
题目大意:
给你一个字符串和二维数组,字符串中'D'表示向下,'R'表示向右,从[0,0]开始,字符串走过的路径为0(数组本身可能也有0),将这些0改为其他数字,是每一行和每一列的总和都相等
大致思路:
解答的关键是找出总和x,而字符串第一个如果是R,则意味着第一列只有一个未知数,如果是D,则意味着第一行只有一个未知数,可以令a[0][0]等于某个值,这样第二行或第二列就也只有一个未知数,可以根据x求得,以此类推
设行数为n,列数为m,总和为x,则有m * x == n * x,由此可分两种情况:
1、m == n
这种情况下,是方阵所以可令a[0][0]等于任意值,为了方便,设为0,由上面分析可求得x的值,然后根据字符串依次求得未知的位置
2、m != n
这种情况下,要使等式成立,x一定等于0,之后根据上面分析,依次求解未知数
代码:
`#include
using namespace std;
define int long long
define endl '\n'
const int N = 200010;
void close() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
void solve() {
int n, m; cin >> n >> m;
string s; cin >> s;
vector<vector
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) cin >> a[i][j];
if (m == n) {
int t = s.size();
a[0][0] = 0;
int sum = 0;
int x = 0, y = 0;
if (s[0] == 'D') {
for (int i = 0; i < m; i++) sum += a[0][i];
x++;
}
else if (s[0] == 'R') {
for (int i = 0; i < n; i++) sum += a[i][0];
y++;
}
for (int i = 1; i < t; i++) {
if (s[i] == 'D') {
int q = 0;
for (int i = 0; i < m; i++) {
if (i != y) q += a[x][i];
}
a[x][y] = sum - q;
x++;
}
else if (s[i] == 'R') {
int q = 0;
for (int i = 0; i < n; i++) {
if (i != x) q += a[i][y];
}
a[x][y] = sum - q;
y++;
}
}
int q = 0;
for (int i = 0; i < n; i++) {
if (i != n - 1) q += a[i][m - 1];
}
a[n - 1][m - 1] = sum - q;
}
else if (m != n) {
int x = 0, y = 0;
int sum = 0;
int t = s.size();
for (int i = 0; i < t; i++) {
if (s[i] == 'D') {
int q = 0;
for (int i = 0; i < m; i++) {
if (i != y) q += a[x][i];
}
a[x][y] = sum - q;
x++;
}
else if (s[i] == 'R') {
int q = 0;
for (int i = 0; i < n; i++) {
if (i != x) q += a[i][y];
}
a[x][y] = sum - q;
y++;
}
}
int q = 0;
for (int i = 0; i < n; i++) {
if (i != n - 1) q += a[i][m - 1];
}
a[n - 1][m - 1] = sum - q;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
}
signed main() {
close();
int T = 1;
cin >> T;
while (T--) solve();
return 0;
}`
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析