Jak czytać dane z pliku tekstowego
FILE *f; // zadeklaruj wskaźnik na plik, na zmienną typu FILE
f = fopen("dane.txt","r"); // przypisz jej wynik działania funkcji fopen
jako parametry tej funkcji podaj:
- nazwę pliku danych
- tryb otwarcia pliku: r – read, w - write, a - append
fscanf(f,”format”,&dana) // czytaj dane funkcją fscanf, podając jej jako pierwszy parametr wskaźnik do pliku
Zadanie
na podstawie zadania z IV Olimpiady Informatycznej) http://www.oi.edu.pl/old/php/show.php?ac=p181600&module=show&file=zadania/oi4/kajaki
Organizujesz spływ kajakowy. Dana jest dopuszczalna ładowność kajaka d, liczba osób n, oraz wagi wszystkich osób. Wyznacz minimalna liczbę potrzebnych kajaków.
Dobrą strategią rozwiązania będzie tu algorytm zachłanny.
Wczytaj d oraz n
Wczytaj dane wszystkich n osób do tablicy o nazwie np. L
Posortuj tablicę L rosnąco: na poczatku będą osoby najlżejsze, na końcu – najcięższe.
Następnie zajmuj kolejne kajaki osobami najcięższymi i sprawdzaj czy uda się dołożyć do każdej z nich osobę aktualnie najlżejszą, jeśli tak to też ją wsadź.
Aktualizuj indeks osoby aktualnie najcięższej i aktualnie najlżejszej przy każdym obsadzeniu kajaka.
i = n-1 // indeks najcięższej osoby która jeszcze czeka na przydział
j = 0 // indeks najlżejższej osoby która jeszcze czeka na przydział
liczbaKajakow = 0
dopóki (j<=i) powtarzaj
i++
liczbaKajakow ++ // przydziel do kajaka aktualnie najcięższą osobę
jeżeli ( L[i]+L[j]<=d) j++ // jeżeli zmieści się z nią najlżejsza osoba, to ją też wsadź
po zakończeniu pętli zwróć liczbęKajakow
Kod programu
#include <cstdio>
#include <algorithm>
int main(){
FILE *plik;
plik = fopen("kaj0.in","r");
int d,n;
fscanf(plik,"%d %d",&d,&n);
printf("kajak zmiesci %d kg, chetnych jest %d osob\n",d,n);
int L[30001];
for (int i=0; i<n; i++) fscanf(plik,"%d",&L[i]);
fclose(plik);
printf(”wczytane wagi osob: \n”);
for (i=0; i<n; i++) printf("%d ",L[i]);
printf("\n");
sort(L,L+n);
printf(”\nposortowane wagi osob: \n”);
for (i=0; i<n; i++) printf("%d ",L[i]);
printf("\n");
int k=0;
int j=0;
i=n-1;
while (j<=i) {
k++;
printf("kajak %d osoba %d",k,L[i]);
if (L[j]+L[i]<=d) {
printf(" i osoba %d \n",L[j]);
j++;
}
else printf("\n");
i--;
}
printf("potrzeba %d kajakow\n",k);
plik = fopen("wynik.out","w");
fprintf(plik,"potrzeba %d kajakow ",k);
fclose(plik);
return 0;
}