Blindpunch ultimo test case

In pratica la soluzione è sbagliata solo nell’ultimo caso, il quale dà output non corretto.

La soluzione che ho adottato è abbastanza semplice e utilizza un set di struct per trovare l’insetto con più probabilità di venire ucciso attualmente. Ogni elemento del set contiene anche la rispettiva probabilità di essere vivo e probabilita iniziale, le quali servono per aggiornare il set a ogni ciabattata.

Chi ha avuto il mio stesso problema?

Ciao, non basterebbe cercare la probabilità più grande per ogni ciabattata aggiungerla progressivamente al risultato e sovrascriverla con la formula Pi*(1-Pi)^(numero di ciabattate su quell’insetto) ? Per realizzare ciò serve un vettore di appoggio dove salvarsi le ciabattate “tirate” per ogni insetto

beh usando il set dovrei avere teoricamente gli stessi risultati.
il set é ordinato per le probabilità attuali(contiene anche la probabilità iniziale di prendere l’insetto, grazie alla quale si può aggiornare la probabilità) in modo da avere possibilità di accedere al massimo in O(1) e aggiornare in O(logN).

comunque qui ho il codice da 70:

#include <bits/stdc++.h>
#define MAXN 200000
using namespace std;
// input data
int T, N, K, i, j;
long double result=0,v;
struct e
{
	long double p,pa,ip;	
	bool operator<(const e r)const{return p>r.p;};
};
e x;

int main() {

  freopen("input.txt", "r", stdin);
 freopen("output.txt", "w", stdout);
set <e>s;
auto point=s.begin();

    assert(1 == scanf("%d", &T));
    for(int cs=0; cs<T; cs++) 
	{
    	result=0;
        assert(2 == scanf("%d %d", &N, &K));
        for(j=0; j<N; j++)
		{
			assert(1 == scanf("%Lf", &v));
			s.insert({v,1,v});
    	}


		while(K)
	   {
			K--;
			
			x=*s.begin();
			result+=x.p;
			x.pa*=1-x.ip;
			x.p=x.pa*x.ip;
			s.erase(s.begin());
			s.insert(x);
		}
        // print result (round down and print six 0decimals)
        // DO NOT EDIT!
        result = floor(result * 1000000) / 1000000;
        printf("%.6Lf\n", result);
        s.clear();
    	
    }

    return 0;
}

non so perché il codice appare così nel forum, è il mio primo post :sweat_smile:

Per postare il codice basta scrivere ``` prima del codice e dopo. L’effetto è circa questo:

 #include <bits/stdc++.h>

using namespace std;

int main(){
 return 0;
}

Per avere anche i colori, basta specificare il linguaggio accanto ai primi ```.

non ho idea del perché ma con la priority_queue funziona, mentre con set no(onestamente mi ero totalmente dimenticato l’esistenza della priority queue). In ogni caso grazie per l’aiuto :slight_smile:

edit: ho ricordato che in set non ci possono essere elementi duplicati :man_facepalming:

Esattamente infatti stavo per chiederti se il set di c era come quello di java cioè che non ammette duplicati… ma non ho detto niente dato che non uso mai questa struttura

A questo scopo, c’è il multiset, ovvero un set che ammette duplicati!

Con un multiset funziona ed è più veloce rispetto alla priority_queue.

questo non lo sapevo. pensavo che la priority (essendo fatta per avere sempre l’elemento più grande) fosse ottimizzata meglio… :thinking:

1 Mi Piace

Nella maggior parte dei casi lo è, puoi anche scriverti la tua versione del binary heap se vuoi ottimizzare.