上海市计算机学会竞赛平台2024年11月月赛丙组线段数
题目描述
给定数组 a=[a1,a2,⋯ ,an]a=[a1,a2,⋯,an],Eve 可以执行任意次(可能 00 次)以下操作:
- 选择 1≤i≤n1≤i≤n,令 ai←ai+1ai←ai+1。
Eve 希望最终数组中任意三个相邻元素之和都是 33 的倍数。
请求出需要达成目标所需的最小操作次数。
输入格式
第一行一个整数 nn。
第二行 nn 个整数 a1,⋯ ,ana1,⋯,an。
输出格式
一行一个整数表示答案。
数据范围
对于 30%30% 的数据,3≤n≤53≤n≤5。
对于 60%60% 的数据,3≤n≤10003≤n≤1000。
对于 100%100% 的数据,3≤n≤1053≤n≤105,1≤ai≤1091≤ai≤109。
样例数据
输入:
3
1 3 5
输出:
0
说明:
1+3+5=9,是 3 的倍数,不需要操作。
输入:
10
2 3 10 25 12 7 10 12 1 46
输出:
3
说明:
对 i=4,7,10 分别操作一次。
详见代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int b[3][3];
int c[3][3];
int ans = 1e9;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
int a;
cin >> a;
b[i % 3][a % 3]++;
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k = 0; k < 3; k++)
{
if (j == k) continue;
if (j > k)
{
c[i][j] += b[i][k] * (j - k);
}
if (j < k)
{
c[i][j] += b[i][k] * (j + 3 - k);
}
}
}
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k = 0; k < 3; k++)
{
if ((i + j + k) % 3 == 0)
{
ans = min(ans, c[0][i] + c[1][j] + c[2][k]);
}
}
}
}
cout << ans;
return 0;
}
原文地址:https://blog.csdn.net/a121677_/article/details/143682633
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!