比赛链接 Dashboard - Codeforces Round 909 (Div. 3) - Codeforces
a
题目大意
a,b玩游戏,给定一个整数n,每人每轮分别能让n加一或者减1,a先开始,如果a某次操作后可以让n被3整除,那么a赢,如果10轮以内a不能赢,则b赢
ACcode
#include<iostream>
using namespace std;
void solve() {
int n; cin >> n;
if (n % 3 == 0)cout << "Second" << '\n';
else cout << "First" << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
b
题目大意
n个箱子,重量不一,以k个为一组进行分装,每一组必须装满k个箱子,1<=k<=n,问对于所有可能的k中,重量差值最大的值是多少
ACcode
#include<iostream>
#include<climits>
#include<algorithm>
using namespace std;
const int M = 2e5 + 9;
int a[M];
using ll = long long;
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
ll ans = INT_MIN;
for (int k = 1; k <= n; k++) {
ll mi = 1e18;
ll ma = -1e18;
if (n % k == 0) {
for (int j = 1; j <= n; j += k) {
ll sum = 0;
for (int v = j; v < j + k; v++) {
sum += a[v];
}
mi = min(mi, sum);
ma = max(ma, sum);
}
ans = max(ans, abs(ma - mi));
}
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
c
题目大意
给定n个元素的数列,求最大子序和,子序中相邻的两个数奇偶性不能相同
思路
dp求最大子序和的板子加上一条奇偶性相同则更新数据的条件
ACcode
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 2e5 + 9;
int a[M];
int dp[M];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
dp[1] = a[1];
int ans = INT_MIN;
for (int i = 1; i <= n; i++) {
if (abs(a[i] % 2) != abs(a[i - 1] % 2)) {
dp[i] = max(dp[i - 1] + a[i], a[i]);
ans = max(dp[i], ans);
}
else {
dp[i] = a[i];
ans = max(dp[i], ans);
}
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
e
题目大意
要对一个数组进行排序,目标是达到非降序,你可以进行以下操作:将第一个元素放在数组最后,将这个元素与前面的元素进行比较并交换,直到这个元素严格大于前面的元素。若不能完成排序则输出-1,否则输出操作次数
思路
假定找到数列中最小的数是j,则操作从j开始将会死循环,所以只需要判断j后面的序列是否为
ACcode
#include<iostream>
#include<climits>
using namespace std;
const int M = 2e5 + 9;
int a[M];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
int mi = INT_MAX;
int p;
for (int i = 1; i <= n; i++) {
if (mi > a[i]) {
mi = a[i];
p = i;//记录操作到哪一位数开始死循环
}
}
bool flag = 0;
for (int i = p; i < n; i++) {
if (a[i] > a[i + 1]) { flag = 1; break; }
}
if (flag) cout << -1 << '\n';
else cout << p-1<<'\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}