// Potyczki algorytmiczne 2015 // Runda próbna - Kanapka // Magdalena Szarkowska #include "kanapka.h" #include "message.h" #include <iostream> #include <cstdio> using namespace std; int main() { ios_base::sync_with_stdio(0); long long n = GetN(); long long nodes = NumberOfNodes(); long long len = (n+nodes-2)/(nodes-1); long long sum = 0; long long pref = 0, minPref = 0, maxPref = 0; long long minSuf = 0; long long minMid = 0, minPom = 0; int no = MyNodeId(); long long int taste; if(no > 0) { for(int i = (no-1)*len; i <= min(no*len-1, n-1); i++) { taste = GetTaste(i); sum = sum + taste; pref = pref + taste; minPref = min(minPref, pref); maxPref = max(maxPref, pref); if(minPom <= 0) minPom = minPom + taste; else minPom = taste; minMid = min(minPom, minMid); } minSuf = sum - maxPref; PutLL(0, sum); PutLL(0, minPref); PutLL(0, minSuf); PutLL(0, minMid); Send(0); } else { long long tab[3*nodes]; long long sumAll = 0, minMinMid = 0; for(int i = 1; i < nodes; i++) { Receive(i); sum = GetLL(i); minPref = GetLL(i); minSuf = GetLL(i); minMid = GetLL(i); tab[3*i-3] = minPref; tab[3*i-2] = sum - minPref - minSuf; tab[3*i-1] = minSuf; sumAll = sumAll + sum; minMinMid = min(minMinMid, minMid); } long long sandwichIsSoTasty = max(0LL, sumAll-minMinMid); long long int result = 0, minResult = 0; for(int i = 0; i < 3*(nodes-1); i++) { if(result <= 0) result = result + tab[i]; else result = tab[i]; minResult = min(result, minResult); } sandwichIsSoTasty = max(sandwichIsSoTasty, sumAll-minResult); cout << sandwichIsSoTasty; } 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 | // Potyczki algorytmiczne 2015 // Runda próbna - Kanapka // Magdalena Szarkowska #include "kanapka.h" #include "message.h" #include <iostream> #include <cstdio> using namespace std; int main() { ios_base::sync_with_stdio(0); long long n = GetN(); long long nodes = NumberOfNodes(); long long len = (n+nodes-2)/(nodes-1); long long sum = 0; long long pref = 0, minPref = 0, maxPref = 0; long long minSuf = 0; long long minMid = 0, minPom = 0; int no = MyNodeId(); long long int taste; if(no > 0) { for(int i = (no-1)*len; i <= min(no*len-1, n-1); i++) { taste = GetTaste(i); sum = sum + taste; pref = pref + taste; minPref = min(minPref, pref); maxPref = max(maxPref, pref); if(minPom <= 0) minPom = minPom + taste; else minPom = taste; minMid = min(minPom, minMid); } minSuf = sum - maxPref; PutLL(0, sum); PutLL(0, minPref); PutLL(0, minSuf); PutLL(0, minMid); Send(0); } else { long long tab[3*nodes]; long long sumAll = 0, minMinMid = 0; for(int i = 1; i < nodes; i++) { Receive(i); sum = GetLL(i); minPref = GetLL(i); minSuf = GetLL(i); minMid = GetLL(i); tab[3*i-3] = minPref; tab[3*i-2] = sum - minPref - minSuf; tab[3*i-1] = minSuf; sumAll = sumAll + sum; minMinMid = min(minMinMid, minMid); } long long sandwichIsSoTasty = max(0LL, sumAll-minMinMid); long long int result = 0, minResult = 0; for(int i = 0; i < 3*(nodes-1); i++) { if(result <= 0) result = result + tab[i]; else result = tab[i]; minResult = min(result, minResult); } sandwichIsSoTasty = max(sandwichIsSoTasty, sumAll-minResult); cout << sandwichIsSoTasty; } return 0; } |