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 a(n), b(n);
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> a(n, vector(m));
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;
}`

posted @   fhsrdfgdsf  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示