Sprawdź się
Zadanie 3
W pewnym kraju odbywają się wybory parlamentarne. Są one przeprowadzane zgodnie z następującą formułą: jest 1000 kandydatów i każdy wyborca może zagłosować na dowolną liczbę z nich. Następnie kandydatów z największą liczbą głosów zostaje wybranych do parlamentu.
W pliku glosy.txt
znajduje się 1000 wierszy. Każdy z nich zawiera liczbę zmiennoprzecinkową z dwoma miejscami po przecinku, zawartą w przedziale . Każda z liczb jest równa odsetkowi głosów, jakie otrzymał dany kandydat.
Przycisk do pobrania pliku TXT z treścią zadania. Pobierz załącznik
Napisz program, który dla pliku głosy.txt
obliczy, jaki odsetek głosów stanowi próg wyborczy. Odpowiedź zapisz do pliku wynik.txt
.
Przykładowe dane:
0.38
0.58
0.22
0.07
0.99
Podane wartości oznaczają, że pierwszy kandydat otrzymał 38% głosów, drugi 58%, trzeci 22%, czwarty 7%, a piąty 99%.
Przyjmijmy, że kandydatów mamy jedynie pięciu i tylko dwóch z nich dostaje się do parlamentu. Dla powyższych przykładowych danych próg wyborczy wynosiłby 58%.
Oznacza to, że wynik wyglądałby następująco:
0.58
Do oceny oddajesz:
plik
wynik.txt
z odpowiedzią (liczba zmiennoprzecinkowa z dwoma miejscami po przecinku z przedziału oznaczająca próg wyborczy, czyli najmniejszy odsetek głosów, jaki zdobył kandydat, który dostał się do parlamentu),plik(i) z komputerową realizacją zadania (kodem programu).
Przedstaw rozwiązanie zadania, pisząc program w języku C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego. Odpowiedź do zadania znajduje się pod sekcją ćwiczeń.
JĘZYK C++
Przykładowe rozwiązanie zadania:
#include <iostream>
#include <vector>
using namespace std;
void sortowanieWybor(vector<float> x, int n) {
int i, klucz, j;
for (i = 1; i < n; i++) {
klucz = x[i];
j = i - 1;
while (j >= 0 && x[j] > klucz) {
x[j + 1] = x[j];
j = j - 1;
}
x[j + 1] = klucz;
}
}
void sortowanieKubelkowe(float x[], int n) {
vector<float> b[n];
for (int i = 0; i < n; i++) {
int bi = n * x[i];
b[bi].push_back(x[i]);
}
for (int i = 0; i < n; i++)
sortowanieWybor(b[i], b[i].size());
int indeks = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < b[i].size(); j++)
x[indeks++] = b[i][j];
}
int main() {
float glosy[] = {0.84, 0.29, 0.25, 0.88, 0.86, 0.31, 0.54, 0.82, 0.61, 0.19, 0.03, 0.88, 0.31, 0.15, 0.84, 0.6, 0.95, 0.42,
0.93, 0.5};
sortowanieKubelkowe(glosy, 20);
cout << glosy[18];
return 0;
}
JĘZYK JAVA
Przykładowe rozwiązanie zadania:
import java.util.Vector;
public class Main {
static void sortowanieKubelkowe(double[] x, int n) {
if (n <= 0)
return;
Vector<Double>[] kubelki = new Vector[n];
for (int i = 0; i < n; i++) {
kubelki[i] = new Vector<Double>();
}
for (int i = 0; i < n; i++) {
double indeks = x[i] * n;
kubelki[(int) indeks].add(x[i]);
}
for (int i = 0; i < n; i++) {
sortowanieWybor sortowanie = new sortowanieWybor();
sortowanie.sortuj(kubelki[i]);
}
int indeks = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < kubelki[i].size(); j++) {
x[indeks++] = kubelki[i].get(j);
}
}
}
public static void main(String[] args) {
double[] glosy = {0.84, 0.29, 0.25, 0.88, 0.86, 0.31, 0.54, 0.82, 0.61, 0.19, 0.03, 0.88, 0.31, 0.15, 0.84, 0.6, 0.95, 0.42,
0.93, 0.5};
sortowanieKubelkowe(glosy, 20);
System.out.println(glosy[18]);
}
}
class sortowanieWybor {
void sortuj(Vector<Double> x) {
int n = x.size();
for (int i = 1; i < n; ++i) {
double klucz = x.get(i);
int j = i - 1;
while (j >= 0 && x.get(j) > klucz) {
x.set(j + 1, x.get(j));
j = j - 1;
}
x.set(j + 1, klucz);
}
}
}
JĘZYK PYTHON
Przykładowe rozwiązanie zadania:
def sortowanie_wybor(b):
for i in range(1, len(b)):
gora = b[i]
j = i - 1
while j >= 0 and b[j] > gora:
b[j + 1] = b[j]
j -= 1
b[j + 1] = gora
return b
def sortowanie_kubelkowe(A):
n = len(A)
kubelki = [[] for _ in range(n)]
maxi = max(A)
mini = min(A)
r = (maxi - mini) / n
if r == 0:
return A
for i in range(n):
d = (A[i] - mini) / r - int((A[i] - mini) / r)
if d == 0 and A[i] != mini:
indeks_kubelka = int((A[i] - mini) / r) - 1
else:
indeks_kubelka = int((A[i] - mini) / r)
kubelki[indeks_kubelka].append(A[i])
output = []
for i in range(n):
kubelki[i] = sortowanie_wybor(kubelki[i])
output.extend(kubelki[i])
return output[::-1]
glosy = [0.84, 0.29, 0.25, 0.88, 0.86, 0.31, 0.54, 0.82, 0.61, 0.19, 0.03, 0.88, 0.31, 0.15, 0.84, 0.6, 0.95, 0.42,
0.93, 0.5]
print(sortowanie_kubelkowe(glosy)[1])
Odpowiedź
Odpowiedź do zadania dla danych zawartych w pliku tekstowym glosy.txt
:
Przycisk do pobrania pliku TXT z wynikiem zadania. Pobierz załącznik