#include <stdio.h> #include "kanapka.h" #include "message.h" long long int N; long long int poczatek, koniec; long long int suma_fragmentu = 0; long long int prefiks = 0; long long int sum_prefiks = 0; long long int sufiks = 0; long long int sum_sufiks = 0; long long int podciag_srodek = 0; long long int wart_dyn = 0; int instancja; long long int statystyki[1000][4]; long long int suma_kanapki = 0; long long int odpowiedz = 0; long long int proba = 0; int main() { N = GetN(); if(N > 50000) { poczatek = ((long long int)(MyNodeId())*N)/((long long int)(NumberOfNodes())); koniec = (((long long int)(MyNodeId())+1)*N)/((long long int)(NumberOfNodes())); koniec -= 1; for(long long int x = poczatek; x <= koniec; x++) { suma_fragmentu += GetTaste(x); sum_prefiks += GetTaste(x); if(prefiks > sum_prefiks) prefiks = sum_prefiks; } for(long long int x = koniec; x >= poczatek; x--) { sum_sufiks += GetTaste(x); if(sufiks > sum_sufiks) sufiks = sum_sufiks; } for(long long int x = poczatek; x <= koniec; x++) { if(wart_dyn >= 0) { wart_dyn = GetTaste(x); } else { wart_dyn += GetTaste(x); } if(podciag_srodek > wart_dyn) podciag_srodek = wart_dyn; } if(MyNodeId() > 0) { PutLL(0, suma_fragmentu); PutLL(0, prefiks); PutLL(0, sufiks); PutLL(0, podciag_srodek); Send(0); } else { for(int i = 1; i < NumberOfNodes(); i++) { instancja = Receive(-1); statystyki[instancja][0] = GetLL(instancja); statystyki[instancja][1] = GetLL(instancja); statystyki[instancja][2] = GetLL(instancja); statystyki[instancja][3] = GetLL(instancja); } statystyki[0][0] = suma_fragmentu; statystyki[0][1] = prefiks; statystyki[0][2] = sufiks; statystyki[0][3] = podciag_srodek; for(int i = 0; i < NumberOfNodes(); i++) suma_kanapki += statystyki[i][0]; for(int i = 0; i < NumberOfNodes(); i++) { if(suma_kanapki-statystyki[i][3] > odpowiedz) odpowiedz = suma_kanapki-statystyki[i][3]; } if(suma_kanapki > odpowiedz) odpowiedz = suma_kanapki; for(int a = 0; a < NumberOfNodes(); a++) { proba = statystyki[a][2]; for(int b = a+1; b < NumberOfNodes(); b++) { proba += statystyki[b][1]; if(suma_kanapki-proba > odpowiedz) { odpowiedz = suma_kanapki-proba; } proba -= statystyki[b][1]; proba += statystyki[b][0]; } } printf("%lld\n", odpowiedz); } } else { if(MyNodeId() == 0) { for(long long int i = 0; i < N; i++) { suma_fragmentu += GetTaste(i); if(wart_dyn >= 0) { wart_dyn = GetTaste(i); } else { wart_dyn += GetTaste(i); } if(podciag_srodek > wart_dyn) podciag_srodek = wart_dyn; } printf("%lld\n", suma_fragmentu-podciag_srodek); } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <stdio.h> #include "kanapka.h" #include "message.h" long long int N; long long int poczatek, koniec; long long int suma_fragmentu = 0; long long int prefiks = 0; long long int sum_prefiks = 0; long long int sufiks = 0; long long int sum_sufiks = 0; long long int podciag_srodek = 0; long long int wart_dyn = 0; int instancja; long long int statystyki[1000][4]; long long int suma_kanapki = 0; long long int odpowiedz = 0; long long int proba = 0; int main() { N = GetN(); if(N > 50000) { poczatek = ((long long int)(MyNodeId())*N)/((long long int)(NumberOfNodes())); koniec = (((long long int)(MyNodeId())+1)*N)/((long long int)(NumberOfNodes())); koniec -= 1; for(long long int x = poczatek; x <= koniec; x++) { suma_fragmentu += GetTaste(x); sum_prefiks += GetTaste(x); if(prefiks > sum_prefiks) prefiks = sum_prefiks; } for(long long int x = koniec; x >= poczatek; x--) { sum_sufiks += GetTaste(x); if(sufiks > sum_sufiks) sufiks = sum_sufiks; } for(long long int x = poczatek; x <= koniec; x++) { if(wart_dyn >= 0) { wart_dyn = GetTaste(x); } else { wart_dyn += GetTaste(x); } if(podciag_srodek > wart_dyn) podciag_srodek = wart_dyn; } if(MyNodeId() > 0) { PutLL(0, suma_fragmentu); PutLL(0, prefiks); PutLL(0, sufiks); PutLL(0, podciag_srodek); Send(0); } else { for(int i = 1; i < NumberOfNodes(); i++) { instancja = Receive(-1); statystyki[instancja][0] = GetLL(instancja); statystyki[instancja][1] = GetLL(instancja); statystyki[instancja][2] = GetLL(instancja); statystyki[instancja][3] = GetLL(instancja); } statystyki[0][0] = suma_fragmentu; statystyki[0][1] = prefiks; statystyki[0][2] = sufiks; statystyki[0][3] = podciag_srodek; for(int i = 0; i < NumberOfNodes(); i++) suma_kanapki += statystyki[i][0]; for(int i = 0; i < NumberOfNodes(); i++) { if(suma_kanapki-statystyki[i][3] > odpowiedz) odpowiedz = suma_kanapki-statystyki[i][3]; } if(suma_kanapki > odpowiedz) odpowiedz = suma_kanapki; for(int a = 0; a < NumberOfNodes(); a++) { proba = statystyki[a][2]; for(int b = a+1; b < NumberOfNodes(); b++) { proba += statystyki[b][1]; if(suma_kanapki-proba > odpowiedz) { odpowiedz = suma_kanapki-proba; } proba -= statystyki[b][1]; proba += statystyki[b][0]; } } printf("%lld\n", odpowiedz); } } else { if(MyNodeId() == 0) { for(long long int i = 0; i < N; i++) { suma_fragmentu += GetTaste(i); if(wart_dyn >= 0) { wart_dyn = GetTaste(i); } else { wart_dyn += GetTaste(i); } if(podciag_srodek > wart_dyn) podciag_srodek = wart_dyn; } printf("%lld\n", suma_fragmentu-podciag_srodek); } } return 0; } |