제출 #1273609

#제출 시각아이디문제언어결과실행 시간메모리
1273609mdobricBoarding Passes (BOI22_passes)C++20
30 / 100
2095 ms19144 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 100005, maxg = 20;
int n, g;
string s;
double prosli[maxn][maxg];
int red[maxg];
double ukp[maxg], lijevo[maxn], desno[maxn], dodaj[maxn];
vector <int> mjesta[maxg];
double ans = 1e18;

int main (void){
	
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> s;
	n = s.size();
	memset(prosli, 0, sizeof prosli);
	for (int i = 0; i < n; i++){
		if (i != 0){
			for (int j = 0; j < 15; j++) prosli[i][j] = prosli[i - 1][j];
		}
		int j = s[i] - 'A';
		if (prosli[i][j] == 0) red[g] = j, g++;
		prosli[i][j]++;
		ukp[j]++;
		mjesta[j].push_back(i);
	}
	sort(red, red + g);
	int brojac = 0;
	do{
		brojac++;
		double tr = 0;
		for (int i = 0; i < n; i++) lijevo[i] = 0, desno[i] = 0, dodaj[i] = 0;
		for (int i = 0; i < g; i++){
			int x = red[i];
			for (int j = 0; j < mjesta[x].size(); j++){
				int y = mjesta[x][j];
				tr += min(lijevo[y] + (prosli[y][x] - 1) / 2, desno[y] + (ukp[x] - prosli[y][x]) / 2);
			}
			
			for (int j = 0; j < mjesta[x].size(); j++) dodaj[mjesta[x][j]] = 1;
			for (int j = 0; j < n; j++){
				if (j == 0) lijevo[j] = dodaj[j];
				else lijevo[j] = lijevo[j - 1] + dodaj[j];
			}
			for (int j = n - 1; j >= 0; j--){
				if (j == n - 1) desno[j] = dodaj[j];
				else desno[j] = desno[j + 1] + dodaj[j];
			}
			
		}
		//cout << endl << tr << endl;
		ans = min(ans, tr);
		
		//if (tr == 10.5) cout << red[0] << red[1] << red[2] << red[3] << red[4] << endl;
	}while (next_permutation(red, red + g));
	cout << fixed << setprecision(10);
	cout << ans << "\n";	

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...