Codeforces Round #612(Div. 2) 문제 해결 보고서
43481 단어 codeforces
4
[제목 링크]
【A.Angry Students】
[제목 대의] A와 P로 구성된 문자열이 있는데 1초에 A는 오른쪽에 있는 P를 A로 바꿀 수 있다. 마지막 P가 A가 될 때가 얼마냐고 묻는다.
[문제풀이 발상] 두 개의 A가 동시에 진행되는 것을 고려하면 두 개의 A 가운데 P의 최대 개수가 바로 답이다.
[AC 코드]
#include
using namespace std;
#define endl '
'
inline void FistIO() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int main() {
FistIO();
int t;
cin >> t;
while (t--) {
int n;
string s;
cin >> n >> s;
int index = 0, Max = 0;
while (index < n) {
while (index < n && s[index] != 'A') ++index;
if (index >= n) break;
++index;
int cnt = 0;
while (index < n && s[index] == 'P') ++index, ++cnt;
Max = max(Max, cnt);
}
cout << Max << endl;
}
return 0;
}
【B.Hyperset】
[제목 대의] S, E, T로 구성된 여러 개의 문자열이 있는데 세 개의 다음과 같은 요구를 충족시키는 문자열은 하나의 집합으로 계산한다.
이 세 문자열의 문자는 한 글자마다 모두 같거나 모두 다르다
[문제풀이 사고방식] O(n3)의 폭력 일치법을 생각하기 쉽지만 시간이 초과될 것이 분명하다. 그러면 O(n2logn)의 방법을 고려하면 우리는 두 문자열에 따라 세 번째 문자열을 구성한 다음에 몇 개의 동일한 문자열이 있는지 보면 된다. 문자열은 맵으로 찾을 수 있다.
[AC 코드]
#include
using namespace std;
#define endl '
'
inline void FistIO() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
string s[1510];
int main() {
FistIO();
register int n, l;
cin >> n >> l;
map<string, int> mp;
map<int, char> check;
check[0] = 'S';
check[1] = 'E';
check[2] = 'T';
check['S'] = 0;
check['E'] = 1;
check['T'] = 2;
if (n < 3) {
cout << "0" << endl;
return 0;
}
for (register int i = 1; i <= n; ++i) {
cin >> s[i];
++mp[s[i]];
}
int ans = 0;
for (register int i = 1; i < n; ++i) {
for (register int j = i + 1; j <= n; ++j) {
string p;
for (register int k = 0; k < l; ++k) {
if (s[i][k] == s[j][k]) p += s[i][k];
else p += check[3 - check[s[i][k]] - check[s[j][k]]];
}
ans += mp[p];
}
}
cout << ans / 3 << endl;
return 0;
}
【C.Garland】
[제목 대의] n개수의 배열을 몇 개의 숫자를 파내면, 파낸 숫자를 다시 채워서 복잡도를 최소화해야 한다.
복잡도 는 인접 짝수 의 다른 개수 로 정의된다
[문제풀이 사고방식]https://blog.csdn.net/qq_43402296/article/details/104046202
[AC 코드]
#include
using namespace std;
#define N 101
#define endl '
'
const int INF = 0x3f3f3f3f;
inline void FistIO() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int a[N], b[N];
int dp[N][N][N][2];
int main() {
int n;
cin >> n;
int even = n - n / 2, odd = n / 2;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if (a[i]) {
if (a[i] & 1) --even;
else --odd;
b[i] = b[i - 1];
}
else b[i] = b[i - 1] + 1;
}
memset(dp, INF, sizeof(dp));
dp[0][0][0][0] = dp[0][0][0][1] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= even; ++j) {
for (int k = 0; k <= odd; ++k) {
if (j + k > b[i]) break;
if (a[i]) {
if (a[i] & 1) dp[i][j][k][1] = min(dp[i - 1][j][k][0] + 1, dp[i - 1][j][k][1]);
else dp[i][j][k][0] = min(dp[i - 1][j][k][1] + 1, dp[i - 1][j][k][0]);
}
else {
if (!j && !k) {
dp[i][j][k][0] = min(dp[i - 1][j][k][0], dp[i - 1][j][k][1] + 1);
dp[i][j][k][1] = min(dp[i - 1][j][k][0] + 1, dp[i - 1][j][k][1]);
}
else if (!j) {
dp[i][j][k][0] = min(dp[i - 1][j][k - 1][0], dp[i - 1][j][k - 1][1] + 1);
dp[i][j][k][1] = min(dp[i - 1][j][k][0] + 1, dp[i - 1][j][k][1]);
}
else if (!k) {
dp[i][j][k][0] = min(dp[i - 1][j][k][0], dp[i - 1][j][k][1] + 1);
dp[i][j][k][1] = min(dp[i - 1][j - 1][k][0] + 1, dp[i - 1][j - 1][k][1]);
}
else {
dp[i][j][k][0] = min(dp[i - 1][j][k - 1][0], dp[i - 1][j][k - 1][1] + 1);
dp[i][j][k][1] = min(dp[i - 1][j - 1][k][0] + 1, dp[i - 1][j - 1][k][1]);
}
}
}
}
}
cout << min(dp[n][even][odd][0], dp[n][even][odd][1]) <<endl;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #715 Div. 2C The Sports Festival: 구간 DP전형구간 DP의 초전형. 이하, 0-indexed. 입력을 정렬하여 어디서나 시작하고 최적으로 좌우로 계속 유지하면 좋다는 것을 알 수 있습니다. {2000})$의 주문이 된다. 우선, 입력을 소트하여 n개의 요소를 $...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.