Σελίδα 1 από 3

Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:23 pm
από mariosal
Αὕτη ἡ ἐμὴ λύσις, παῖδες.

Κώδικας: Επιλογή όλων

#include <stdio.h>

int main( void ) {
    int N;
    short i, j = 1000;
    float P = 1, p;

    FILE *file = fopen( "profit.in", "r" );
        fscanf( file, "%d", &N );
        while ( N-- ) {
            fscanf( file, "%hd", &i );

            j = i < j ? i : j;
            p = ( float )i / j;
            P = p > P ? p : P;
        }
    fclose( file );

    file = fopen( "profit.out", "w" );
        fprintf( file, "%.3f\n", P );
    fclose( file );

    return 0;
}

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:26 pm
από pman
Είχα στείλει 2 λύσεις , μία σε Pascal και μία σε C . Τελικά κράτησα αυτή σε C.

Κώδικας: Επιλογή όλων

#include <stdio.h>
int i , n;
float x , P , paran=1000.0f;
int main(){
 FILE*fin=fopen("profit.in","r");
 FILE*fout=fopen("profit.out","w");
 fscanf(fin,"%d",&n);
 for(i=0;i<n;++i){
 fscanf(fin,"%f",&x);
 if(x < paran)paran=x;
 if(x/paran > P)P=x/paran;
 }fclose(fin);
 fprintf(fout,"%.3f\n",P);
 fclose(fout);
 return 0;   
}

Κώδικας: Επιλογή όλων

program profit;

var
    fin , fout: text;
    i , n : integer;
    x , P , paran : Real;    

begin

        assign( fin, 'profit.in' );
        assign( fout, 'profit.out' );
        reset( fin );
        rewrite( fout );

        read( fin , n);
        paran := 1000;
        P:=0;

        for i := 1 to n do
        begin
        read( fin , x);

        if x < paran then
        paran := x;

	    if (x / paran) > P then
        P := x / paran;
        end ;

        writeln( fout, P : 0 : 3);

        close( fin );
        close( fout );
        halt(0);
end.


Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:42 pm
από mr.muffin

Κώδικας: Επιλογή όλων

#include <fstream>
#include <iomanip>
using namespace std;
int a=0;
int valuesize=0;
int counter=0;
int main () {
    double logos=1.000;
    
   
ifstream input("profit.in");
  	input >> valuesize;
  	int arx,tel;
		input >> arx;
  		while (!input.eof()) {
        input >> tel;
        if(arx<tel)
        {
            if(float(tel)/float(arx)>logos)
        logos=float(tel)/float(arx);
        }
        else
        arx=tel;
        
        }

    input.close();
  
    ofstream save("profit.out");
save << fixed << setprecision (3) << logos << "\n";

    save.close();
    
    return 0;
}

Τι λεει η δικια μου λυση?

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:49 pm
από chris
Το ίδιο με του Σωτήρη κάνω μου φαίνεται:
[pastebin]http://pastebin.com/JM4prEeq[/pastebin]

Πραγματικά ελπίζω να μην έχω καμιά βλακεία γιατί έκανα 1 υποβολή συνολικά (δεν θυμάμαι πότε)... Χθες που το είδα σωστό μου φάνηκε!

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:51 pm
από errietta
Είναι σε C++... Enjoy =P

Κώδικας: Επιλογή όλων

#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
	vector <int> smallest;
	float maxProfit = 0.000;
	ifstream in ("profit.in");
	ofstream out ("profit.out");
	int N;
	in >> N;
	int minN = 1001;
	vector <int> numbers;
	for (int i = 0; i < N; i++) {
		int x;
		in >> x;
		if ( x < minN ) {
			minN = x;
		}
		numbers.push_back (x);
		smallest.push_back (minN);
	}
	for (int i = 0; i < N; i++) {
		if ( ( (float) numbers[i] / (float) smallest[i] ) > maxProfit )
			maxProfit = (float) numbers[i] / (float) smallest[i];
	}
	out << fixed << setprecision(3) << maxProfit << endl;
	return 0;
}

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:53 pm
από Virus•Hacker•Kontos
chris έγραψε:Το ίδιο με του Σωτήρη κάνω μου φαίνεται:
[pastebin]http://pastebin.com/JM4prEeq[/pastebin]

Πραγματικά ελπίζω να μην έχω καμιά βλακεία γιατί έκανα 1 υποβολή συνολικά (δεν θυμάμαι πότε)... Χθες που το είδα σωστό μου φάνηκε!

και εγώ τον ίδιο κώδικα έχω αν και μπορεί να έχω τίποτα παραπάνω (που δεν χρειάζεται) αλλά η λύση είναι ακριβώς η ίδια στη λογική, (δεν υπάρχει περίπτωση να τον βρώ στον υπολογιστή, δεν ξέρω κιόλας...)

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:57 pm
από pman
Virus•Hacker•Kontos έγραψε:
chris έγραψε:Το ίδιο με του Σωτήρη κάνω μου φαίνεται:
[pastebin]http://pastebin.com/JM4prEeq[/pastebin]

Πραγματικά ελπίζω να μην έχω καμιά βλακεία γιατί έκανα 1 υποβολή συνολικά (δεν θυμάμαι πότε)... Χθες που το είδα σωστό μου φάνηκε!

και εγώ τον ίδιο κώδικα έχω αν και μπορεί να έχω τίποτα παραπάνω (που δεν χρειάζεται) αλλά η λύση είναι ακριβώς η ίδια στη λογική, (δεν υπάρχει περίπτωση να τον βρώ στον υπολογιστή, δεν ξέρω κιόλας...)
Ένας int απλά δεν αρκούσε;

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:59 pm
από chris
Σε περίπτωση που δεν είναι κατανοητή η λύση μου μετά από 10 δευτερόλεπτα ανάγνωσης, βασικά:

Για κάθε τιμή χ
αν x < min, τότε min = x
αλλιώς αν x/min > best, τότε best = x/min

Έπειτα δίνω στην έξοδο το best.

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 3:59 pm
από chris
sotiris έγραψε:
Virus•Hacker•Kontos έγραψε:
chris έγραψε:Το ίδιο με του Σωτήρη κάνω μου φαίνεται:
[pastebin]http://pastebin.com/JM4prEeq[/pastebin]

Πραγματικά ελπίζω να μην έχω καμιά βλακεία γιατί έκανα 1 υποβολή συνολικά (δεν θυμάμαι πότε)... Χθες που το είδα σωστό μου φάνηκε!

και εγώ τον ίδιο κώδικα έχω αν και μπορεί να έχω τίποτα παραπάνω (που δεν χρειάζεται) αλλά η λύση είναι ακριβώς η ίδια στη λογική, (δεν υπάρχει περίπτωση να τον βρώ στον υπολογιστή, δεν ξέρω κιόλας...)
Ένας int απλά δεν αρκούσε;
Αρκούσε :P

EDIT:
Αχαχαχαχα, έλεος με τον τίτλο του topic :P
Errieta, σωστό μου φένεται. Το ίδιο με εμάς κάνεις κατά κάποιον τρόπο.
mariosal, βάλε και καμιά μεταβλητή με κανονικό όνομα χD.

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 4:04 pm
από Chapeiro
Ορίστε και η δικιά μου : (C++)

Κώδικας: Επιλογή όλων

#define inputFile "profit.in"
#define outputFile "profit.out"
#include <fstream>

using namespace std;

int calculateMaxProfit();
float extract(istream* in, int N);
float getProfit(float sell, float buy);

int main() {
	return calculateMaxProfit();
}

int calculateMaxProfit() {
	int N;
	//open input file
	ifstream in(inputFile);
	//open output file
	ofstream out(outputFile);
	if (in.is_open()) {
		in >> N;	//reads number of days
		float maxProfit = extract(&in, N);
		FILE * out = fopen(outputFile, "w");
		fprintf(out, "%.3f\n", maxProfit);
		fclose(out);
		in.close();
		return 0;
	} else {
		return -1;
	}
}

float getProfit(float sell, float buy) {
	return (sell / buy);
}

float extract(istream* in, int N) {
	int a;
	*in >> a;				//get first day's price
	int minBuyingPrice = a;
	float maxProfit = 1;	//	(a/a)=1
	for (int i = 2; i <= N; i++) {
		*in >> a;			//get ith's day price
		if (a < minBuyingPrice) {
			minBuyingPrice = a;
		} else {
			float newProfit(getProfit(a, minBuyingPrice));
			if (newProfit > maxProfit) {
				maxProfit = newProfit;
			}
		}
	}
	return maxProfit;
}

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 4:05 pm
από pman
chris έγραψε:Σε περίπτωση που δεν είναι κατανοητή η λύση μου μετά από 10 δευτερόλεπτα ανάγνωσης, βασικά:

Για κάθε τιμή χ
αν x < min, τότε min = x
αλλιώς αν x/min > best, τότε best = x/min

Έπειτα δίνω στην έξοδο το best.
Α γιαυτό έχεις else .....

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 4:06 pm
από Virus•Hacker•Kontos

Κώδικας: Επιλογή όλων


   1. #include <stdio.h>  
   2.   
   3. #define FINAL_SOLOUTION  
   4.   
   5. #ifndef FINAL_SOLOUTION  
   6.     #define CLOCK_COUNT  
   7.     #include <conio.h>  
   8.     #include <time.h>  
   9. #endif  
  10.   
  11. #ifndef FINAL_SOLOUTION  
  12. #define N_FINAL_SOL  
  13.   
  14. #endif  
  15.   
  16.   
  17. //#define BRUTE_FORCE  
  18. #define FAST_SOL  
  19.   
  20. FILE *fin;  
  21. FILE *fout;  
  22.   
  23.   
  24. int N;  
  25. int timi_meras[1000000];  
  26.   
  27. float result = 0.0f;  
  28.   
  29. float brute_force_soloution();  
  30. float fast_soloution();  
  31.   
  32. int main()  
  33. {  
  34.     #ifdef CLOCK_COUNT  
  35.     printf("CLOCK START TIME: %d\n=============================================\n",clock());  
  36.     #endif  
  37.       
  38.       
  39.     fin = fopen("profit.in","r");  
  40.     fscanf(fin,"%d",&N);  
  41.       
  42.     for(int i=0;i<N;i++)  
  43.     {  
  44.         fscanf(fin,"%d",&timi_meras[i]);  
  45.     }  
  46.   
  47.   
  48. #ifdef BRUTE_FORCE  
  49. result = brute_force_soloution();  
  50. #endif  
  51. #ifdef FAST_SOL  
  52. result = fast_soloution();  
  53. #endif  
  54.       
  55.   
  56. #ifdef N_FINAL_SOL  
  57.     printf("To arxeio eksodou einai: \n%.3f\n",result);   
  58. #endif  
  59.   
  60.     #ifdef FINAL_SOLOUTION  
  61.     fout = fopen("profit.out","w+");  
  62.     fprintf(fout,"%.3f\n",result);  
  63.     fclose(fout);  
  64.     #endif  
  65.   
  66.     fclose(fin);  
  67.   
  68.     #ifdef CLOCK_COUNT  
  69.     printf("\n=============================================\nCLOCK END TIME: %d\n=============================================",clock());  
  70.     #endif  
  71.       
  72. #ifdef N_FINAL_SOL  
  73.     getch();  
  74. #endif  
  75.     return 0;  
  76. }  
  77.   
  78.   
  79.   
  80.   
  81. float brute_force_soloution()  
  82. {  
  83.     float max_sol = 1.0f;  
  84.       
  85.     int i=0,i2=0;  
  86.     for(i=0;i<N;i++)  
  87.         for(i2=i+1;i2<N;i2++)  
  88.             if(max_sol < (float) ((float)timi_meras[i2] / (float) timi_meras[i]))  
  89.                 max_sol = (float)timi_meras[i2] /  (float)timi_meras[i];  
  90.           
  91.     //printf("\n===============================================\nMax_sol: %.3f\n",max_sol);   
  92.       
  93.   
  94.     return max_sol;  
  95. }  
  96.   
  97. float fast_soloution()  
  98. {  
  99.     float max_sol = 1.0f;  
 100.       
 101.     int i;  
 102.     int lowest_price = timi_meras[0];  
 103.     for(i=0;i<N;i++)  
 104.     {  
 105.         if(lowest_price > timi_meras[i])  
 106.             lowest_price = timi_meras[i];  
 107.         if(max_sol < (float)timi_meras[i] / (float)lowest_price)  
 108.             max_sol = (float)timi_meras[i] / (float)lowest_price;  
 109.     }  
 110.   
 111.     return max_sol;  
 112. }


Απο το hellenico...


Oooo, τελικά δεν είχα βγάλει τα περιτά!!! Ελπίζω να μην το πληρώσω...

Ήταν όταν είχα ξαναγράψει τη λύση μου σε Visual Studio... Τι το ήθελα και την πόσταρα...

Ευτιχώς βγάζει σωστά αποτελέσματα...

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 4:15 pm
από pman
Offtopic , αλλά συγκλονιστικές και ανεπανάληπτες στιγμές σήμερα
Spoiler: show
Περισσότερα μέλη σε σύνδεση 42 την Δευτ Ιαν 24, 2011 12:59 pm

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 4:22 pm
από chris
sotiris έγραψε:Offtopic , αλλά συγκλονιστικές και ανεπανάληπτες στιγμές σήμερα
Spoiler: show
Περισσότερα μέλη σε σύνδεση 42 την Δευτ Ιαν 24, 2011 12:59 pm
σχολείο δεν πήγατε;;; :P

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 6:31 pm
από zaxeilasfc
Χαχαχα απ οτι φαίνεται όλοι είχαν αγωνία για τα αποτελέσματα (που απ' ότι φαίνεται θα αργήσουν να βγούν) και δεν πήγανε σχολείο.

Ορίστε λοιπόν και η δική μου λύση:

Κώδικας: Επιλογή όλων

/*
Author: Ioannis Zaxeilas
Language: C++
Problem: Maxprofit
*/

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
  	ifstream fin("profit.in");
	ofstream fout("profit.out");
	
	int ndays;
	float  a, b, c, min, max;
	float maxprofit, pmax;
	
	fin>>ndays;
	fin>>a;
	fin>>b;
	
    if(a>b)
    {
        max=a;
        min=b;
     	}
   else { 
		max=b;
		min=a;
		pmax=b/a;
       	}

  while (!fin.eof())
	{
        fin>>c;
		
        if(c>max) {
			
			max=c;   
			pmax=c/min;
			if(pmax>maxprofit) maxprofit=pmax;
       		}              
        else if(c<min)
		{
			min=c;
			max=1;
        }
		
	}              
	fout<<setprecision(3)<<fixed<<maxprofit<<endl;
	fin.close();
	fout.close();
		return 0;
}
Κάθε σχόλιο καλοδεχούμενο!

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 6:45 pm
από themis5

Κώδικας: Επιλογή όλων

    #include <cstdio>  
      
    using namespace std;  
      
    float find_profit( int* array, int elems ) {  
        int k, o = 0;  
        int buy;  
        int sell;  
        float profit = 1.0;  
        for ( int i = 0; i < elems; ++i ) {  
            for ( k = i; k < elems; ++k ) {  
                if ( ( (double)array[ k ] / array[ i ] ) > profit ) {  
                    profit = (double)array[ k ] / array[ i ];  
                }  
            }  
        }  
        return profit;  
    }  
      
    int main() {  
        int n, x, l;  
        FILE * out;  
        FILE * in;  
      
        in = fopen( "profit.in", "r" );  
        fscanf( in, "%i", &n );  
      
        int a[ n ];  
      
        for ( l = 0; l < n; ++l ) {  
            fscanf( in, "%i", &x );  
            a[ l ] = x;  
        }  
      
        fclose( in );  
        out = fopen( "profit.out", "w" );  
      
        fprintf( out, "%.3f\n", find_profit( a, n ) );  
      
        fclose( out );  
        return 0;  
    }  

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 7:03 pm
από zaxeilasfc
themi, exw valei tin lisi sou kai trexei edw kai 2 lepta me n=1.000.000
whats goin' on :?:

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 8:41 pm
από errietta
Η δικιά μου πάντως με 1.000.000 γραμμές τυχαίο input είναι γρήγορη... :geek:

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 9:23 pm
από compileGuy
zaxeilasfc έγραψε:themi, exw valei tin lisi sou kai trexei edw kai 2 lepta me n=1.000.000
whats goin' on :?:
Έχει πολυπλοκότητα Ο ( Ν^2 ) . Για Ν=1.000.000 θα κάνει περίπου 2.5 ώρες για να τελειώσει.

Δεν λέει να βάλω την λύση μου , αφού τουλάχιστον 5-6 παρόμοιες υπάρχουν πιο πανω ;)

Re: Λύσεις Α´ Φάσεως ΚΓ´ Πανελληνίου Διαγωνισμοῦ Πληροφορικῆς

Δημοσιεύτηκε: Δευ Ιαν 24, 2011 11:03 pm
από kernelpanic
Λοιπόν εγώ έκανα 2 βελτιώσεις στην απλή γραμμική λύση:
  • Άλλαξα το

    Κώδικας: Επιλογή όλων

    if((float)a/(float)b>(float)c/(float)d)
    με το ισοδύναμό του

    Κώδικας: Επιλογή όλων

    if(a*d>c*b)
    Κέρδος: Από 4 εντολές μηχανής fld, 2 εντολές fdiv, κάμποσες εντολές fxch, μια εντολή fcmp, μια εντολή sahf, και μια εντολή που δε θυμάμαι συνολικά για τη σύγκριση κλασμάτων, σε 2 εντολές mul/imul και μια cmp ή sub. 8-)
  • Φόρτωσα όλο το αρχείο με μια εντολή fread και μετά το επεξεργάστηκα όπως ήταν. Ο χρόνος εκτέλεσης έγινε περίπου το 1/10 του αρχικού :D
Spoiler: show

Κώδικας: Επιλογή όλων

#include "stdio.h"
//#include "assert.h"

FILE *io;
char file[6000100];

int main(){

	int i,n,t,max_panw=1,max_katw=1,panw,katw,len;

	io=fopen("profit.in","rb");
	//assert(io);
	
	fseek(io,0,SEEK_END);
	len=ftell(io);
	fseek(io,0,SEEK_SET);
	//printf("%d bytes\n",len);
	fread(file,len,1,io);
	//printf("Text:\n%s",file);
	
	i=0;
	for(t=0;file[i]>='0';i++){
		t*=10;
		t+=file[i]-'0';
	}
	n=t;
	//printf("%d\n",n);
	for(;file[i]<'0';i++);
	for(t=0;file[i]>='0';i++){
		t*=10;
		t+=file[i]-'0';
	}
	panw=katw=t;
	//printf("%d\n",panw);
	t=0;
	
	
	for(;i<len;i++){
		for(;file[i]<'0';i++);
		for(t=0;file[i]>='0';i++){
			t*=10;
			t+=file[i]-'0';
		}
		if(t<katw){
			//printf("katw\n");
			if(katw*max_panw<panw*max_katw){
				//printf("NEO PROFIT!!!(%d/%d)\n",panw,katw);
				max_katw=katw;
				max_panw=panw;
			}
			panw=katw=t;
			//printf("tmp PROFIT:(%d/%d)\n",panw,katw);

		}else if(t>panw){
			//printf("NEO PEKOP!!!\n");
			panw=t;
		}				
	
	}
	
	if(katw*max_panw<panw*max_katw){
		//printf("NEO PROFIT!!!(%d/%d)\n",panw,katw);
		max_katw=katw;
		max_panw=panw;
	}

	freopen("profit.out","w",io);
	fprintf(io,"%.3f\n",((float)max_panw)/((float)max_katw));
	fclose(io);
	return(0);
}
Ηθικό δίδαγμα: Όταν ο διαθέσιμος χρόνος μετράται σε μήνες, οι χακιές επιβάλλονται :P