제출 #1173811

#제출 시각아이디문제언어결과실행 시간메모리
1173811InvMODMiners (IOI07_miners)C++20
40 / 100
1596 ms584 KiB
#include<bits/stdc++.h> using namespace std; #define sz(v) (int)(v).size() template<typename T> bool ckmx(T& a, const T& b){ if(a < b) return a = b, true; return false; } int n; string S; namespace Sub1{ void process() { auto calc = [&](string x) -> int{ int answer = 0; for(int i = 0; i < sz(x); i++){ if(i == 0){ answer = answer + 1; } else if(i == 1){ answer = answer + 1 + (x[i] != x[i - 1]); } else{ set<int> s = {x[i], x[i - 1], x[i - 2]}; answer = answer + sz(s); } } return answer; }; int answer = 0; for(int mask = 0; mask < (1 << n); mask++){ string mine1 = "", mine2 = ""; for(int i = 0; i < n; i++){ if(mask >> i & 1){ mine1 += S[i]; } else mine2 += S[i]; } answer = max(answer, calc(mine1) + calc(mine2)); } cout << answer << "\n"; } } /* We only care about 2 previous type dp[i][mine 1 first][mine 1 second][mine 2 first][mine 2 second]: at i, 2 previous type of mine 1, 2 previous type of mine 2 if we did not choose, the type will be 0 */ namespace Sub2{ int dp[2][4][4][4][4]; void process() { auto calc = [&](int first, int second, int cur) -> int{ set<int> s = {first, second, cur}; return sz(s) - (!((*s.begin()))); }; memset(dp[0], -0x3f, sizeof(dp[0])); dp[0][0][0][0][0] = 0; int answer = 0; for(int i = 1; i <= n; i++){ int type = (S[i] == 'M' ? 1 : (S[i] == 'F' ? 2 : 3)); int cur = (i & 1), pre = (i & 1) ^ 1; memset(dp[cur], -0x3f, sizeof(dp[cur])); for(int m1t1 = 0; m1t1 <= 3; m1t1++){ for(int m1t2 = 0; m1t2 <= 3; m1t2++){ for(int m2t1 = 0; m2t1 <= 3; m2t1++){ for(int m2t2 = 0; m2t2 <= 3; m2t2++){ ckmx(dp[cur][m1t2][type][m2t1][m2t2], dp[pre][m1t1][m1t2][m2t1][m2t2] + calc(m1t1, m1t2, type)); ckmx(dp[cur][m1t1][m1t2][m2t2][type], dp[pre][m1t1][m1t2][m2t1][m2t2] + calc(m2t1, m2t2, type)); ckmx(answer, dp[cur][m1t2][type][m2t1][m2t2]); ckmx(answer, dp[cur][m1t1][m1t2][m2t2][type]); } } } } } cout << answer << "\n"; } } void solve() { cin >> n >> S; Sub2::process(); } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define name "InvMOD" if(fopen(name".INP", "r")){ freopen(name".INP", "r", stdin); freopen(name".OUT", "w", stdout); } solve(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

miners.cpp: In function 'int32_t main()':
miners.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  115 |         freopen(name".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
miners.cpp:116:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  116 |         freopen(name".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...