1 solutions
-
1negative_iq LV 8 @ 2025-01-03 06:45:51
Since the constraint of N is <= 2000, We precompute all the primes upto N and store them in an array using Sieve. Then we run a 3 nested loop brute force to check all the possible prime combinations that satisfies p1 + p2 + p3 == n. and greedily try to match the frequency of each character. Our answer will be the minimum cost out of all of them. And do not forget to insert 0 in the prime array. Since we can completely remove a character
#include <bits/stdc++.h> #ifndef ONLINE_JUDGE // #include "template.cpp" #else #define debug(...) #define debugArr(...) #endif #define F first #define S second // #define int long long #define double long double #define eb emplace_back #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) (int)x.size() #define mp(x, y) make_pair(x, y) #define lb lower_bound #define ub upper_bound #define ins insert #define INF (int)1e8 using namespace std; using pii = pair<int, int>; using pdd = pair<double, double>; using pbb = pair<bool, bool>; using pcc = pair<char, char>; using pss = pair<string, string>; using vi = vector<int>; using vd = vector<double>; using vb = vector<bool>; using vc = vector<char>; using vs = vector<string>; using vpii = vector<pair<int, int>>; using vpdd = vector<pair<double, double>>; using vpbb = vector<pair<bool, bool>>; using vpcc = vector<pair<char, char>>; using vpss = vector<pair<string, string>>; using vvi = vector<vector<int>>; using vvd = vector<vector<double>>; using vvb = vector<vector<bool>>; using vvc = vector<vector<char>>; using vvs = vector<vector<string>>; using vvpii = vector<vector<pair<int, int>>>; using vvpdd = vector<vector<pair<double, double>>>; using vvpbb = vector<vector<pair<bool, bool>>>; using vvpcc = vector<vector<pair<char, char>>>; using vvpss = vector<vector<pair<string, string>>>; // clang-format off template <class T> using pq = priority_queue<T>; template <class T> using pqg = priority_queue<T, vector<T>, greater<T>>; template <class T> T sqrt_(T elem) {int l=1,r=elem;while(l<=r){int mid=l+(r-l)/2LL;if(mid>elem/mid){r=mid-1;}else{int val=mid*mid;if(val<=elem){l=mid+1;}else{r=mid-1;}}}return r;} template <class T> T ceil_(T a,T b) {return(a+b-1)/b;}; template <class T> T mod_add(T a,T b,T mod){return((a%mod)+(b%mod))% mod;} template <class T> T mod_sub(T a,T b,T mod){return((a%mod)-(b%mod)+mod)%mod;} template <class T> T mod_mul(T a,T b,T mod){return((a%mod)*(b%mod))%mod;} template <class T> T mod_inv(T a,T mod){T m0=mod,y=0,x=1;if(mod==1)return 0;while(a>1){T q=a/mod;T t=mod;mod=a%mod,a=t;t=y;y=x-q*y;x=t;}if(x<0)x+=m0;return x;} template <class T> T mod_div(T a,T b,T mod){return mod_mul(a,mod_inv(b,mod),mod);} // clang-format on const int N = 2000; vb isPrime(N + 1, true); vi res; void preCompute() { isPrime[0] = isPrime[1] = false; for (int i = 2; i * i <= N; i++) { if (isPrime[i]) { for (int j = i * i; j <= N; j += i) { isPrime[j] = false; } } } res.eb(0); for (int i = 2; i <= N; ++i) { if (isPrime[i]) { res.eb(i); } } } void solve() { int n; string s; cin >> n >> s; int a = 0, b = 0, c = 0; for (int i = 0; i < n; ++i) { if (s[i] == 'a') { ++a; } else if (s[i] == 'b') { ++b; } else { ++c; } } int ans = INF; for (int i = 0; i < sz(res); ++i) { int v1 = res[i]; if (v1 > n) { break; } for (int j = 0; j < sz(res); ++j) { int v2 = res[j]; if (v1 + v2 > n) { break; } for (int k = 0; k < sz(res); ++k) { int v3 = res[k]; int total = v1 + v2 + v3; if (total > n) { break; } if (total == n) { int val = 0, curr = 0; if (a <= v1) { curr += v1 - a; val += v1 - a; } else { curr += a - v1; val += -(a - v1); } // if (v1 == 0 && v2 == 0 && v3 == 5) { // debug(curr, val); // } if (b <= v2) { if (val < 0) { val += v2 - b; if (val > 0) { curr += val; } } else { val += v2 - b; curr += v2 - b; } } else { if (val > 0) { val += -(b - v2); if (val < 0) { curr += abs(val); } } else { val += -(b - v2); curr += abs(b - v2); } } // if (v1 == 0 && v2 == 0 && v3 == 5) { // debug(curr, val); // } if (c <= v3) { if (val < 0) { val += v3 - c; if (val > 0) { curr += val; } } else { val += v3 - c; curr += v3 - c; } } else { if (val > 0) { val += -(c - v3); if (val < 0) { curr += abs(val); } } else { val += -(c - v3); curr += abs(c - v3); } } // if (v1 == 0 && v2 == 0 && v3 == 5) { // debug(curr, val); // } // debug(v1, v2, v3, curr); ans = min(ans, curr); } } } } if (ans == INF) { ans = -1; } cout << ans << '\n'; return; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int tt = 1, count = 1; preCompute(); cin >> tt; while (tt--) { // cout << "Case #" << count << ": "; solve(); ++count; } return 0; }
- 1
Information
- ID
- 1158
- Difficulty
- 5
- Category
- (None)
- Tags
- (None)
- # Submissions
- 25
- Accepted
- 13
- Accepted Ratio
- 52%
- Uploaded By