[USACO07MAR] Face The Right Way G
2024年12月25日大约 1 分钟
枚举 K 然后暴力翻转检验
#include <bits/stdc++.h>
using namespace std;
int n;
string s, t;
int check(int k)
{
int cnt = 0;
for (int i = 0; i + k - 1 < t.size(); i++)
if (t[i] == 'B')
{
cnt++;
for (int j = i; j <= i + k - 1; j++)
{
if (t[j] == 'B')
t[j] = 'F';
else
t[j] = 'B';
}
}
for (int i = (int)t.size() - k; i < t.size(); i++)
if (t[i] == 'B')
return -1;
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
s = "";
for (int i = 1; i <= n; i++)
{
char x;
cin >> x;
s += x;
}
int ansCnt = n, ansK = 1;
for (int k = 1; k <= n; k++)
{
t = s;
int cnt = check(k);
if (cnt != -1 && cnt < ansCnt)
{
ansCnt = cnt;
ansK = k;
}
}
cout << ansK << " " << ansCnt << "\n";
return 0;
}
差分数组加速翻转
#include <bits/stdc++.h>
using namespace std;
int n;
string s, t;
int d[5005];
int check(int k)
{
for (int i = 0; i <= n; i++)
d[i] = 0;
int cnt = 0;
int now = 0; // 差分之和
int i;
for (i = 0; i + k - 1 < t.size(); i++)
{
now += d[i];
if (t[i] == 'B' && now % 2 == 0 ||
t[i] == 'F' && now % 2 == 1)
{
cnt++;
now++;
d[i + k]--;
}
}
for (; i < t.size(); i++)
{
now += d[i];
if (t[i] == 'B' && now % 2 == 0 ||
t[i] == 'F' && now % 2 == 1)
return -1;
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
s = "";
for (int i = 1; i <= n; i++)
{
char x;
cin >> x;
s += x;
}
int ansCnt = n, ansK = 1;
for (int k = 1; k <= n; k++)
{
t = s;
int cnt = check(k);
if (cnt != -1 && cnt < ansCnt)
{
ansCnt = cnt;
ansK = k;
}
}
cout << ansK << " " << ansCnt << "\n";
return 0;
}