Tralasciando il fatto che nell’ultima subtask vado fuori tempo massimo, non riesco a capire nelle altre dove sbaglio output.
#include <iostream>
using namespace std;
int main(){
unsigned long long giocatori,giocatori_da_scegliere;
cin>>giocatori>>giocatori_da_scegliere;
unsigned long long amico[giocatori],punti_solo[giocatori],punti_insieme[giocatori],ok[giocatori]={0};
for(int i=0;i<giocatori;i++)cin>>amico[i]>>punti_solo[i]>>punti_insieme[i];
unsigned long long punti_in_coppia[giocatori/2];
unsigned long long cnt=0;
for(int i=0;i<giocatori;i++){
if(ok[i]==0){
punti_in_coppia[cnt]=punti_insieme[i]+punti_insieme[amico[i]];
ok[amico[i]]=1;
cnt++;
}
}
unsigned long long ok_coppia[giocatori/2]={0};
unsigned long long ok_singolo[giocatori]={0};
unsigned long long punti_parziali=0,punti_tot=0,amico1,amico2;
while(giocatori_da_scegliere>0){
punti_parziali=0;
if(giocatori_da_scegliere>1){
for(int i=0;i<giocatori/2;i++){
if(punti_parziali<punti_in_coppia[i]&&ok_coppia[i]==0){
punti_parziali=punti_in_coppia[i];
amico1=i;
amico2=amico[i];
}
}
ok_coppia[amico1]=1;
ok_singolo[amico1]=1;
ok_singolo[amico2]=1;
punti_tot+=punti_parziali;
giocatori_da_scegliere-=2;
}else{
punti_parziali=0;
for(int i=0;i<giocatori;i++)if(punti_parziali<punti_solo[i]&&ok_singolo[i]==0)punti_parziali=punti_solo[i];
punti_tot+=punti_parziali;
giocatori_da_scegliere=0;
}
}
cout<<punti_tot;
}
Quella che è la mia idea è di andare prima a trovare i punteggi per ogni coppia, poi di usare la coppia più prolifica e di contrassegnarla come non più utilizzabile, contrassegnando anche i due componenti della coppia. Poi, quando ne rimane solo uno vado a vedere quello non utilizzato con il punteggio più alto. Non riesco a trovare un’altro approccio al problema, anche se questo non è efficiente su tutti i testcase.