#include <stdio.h> #include <assert.h> #include <stdlib.h> #include "cielib.h" #define MAX_INT 1000000000 #define OVER_MAX_INT 1000000000 #define MAX_DIM 600 int rogDolny[MAX_DIM]; int rogGorny[MAX_DIM]; int wynik[MAX_DIM]; int mid[MAX_DIM]; int k,d,r; int total; int rozneRogi(){ for(int i = 0; i < d; i++) if (rogDolny[i] != rogGorny[i]) return 1; return 0; } /* int kostka(){ int res = 0; for(int i = 0; i < d; i++) if (abs(rogDolny[i] - rogGorny[i]) == 1) res++; assert(res == 0 || res == d); return res == d; }*/ int zaciesnia(int dim){ int midPocz[MAX_DIM]; int midKon[MAX_DIM]; if (rogDolny[dim] == rogGorny[dim]) return 0; for(int i = 0; i < d; i++){ midPocz[i] = midKon[i] = (rogDolny[i] + rogGorny[i]) / 2;//nie wiadomo co zrobic z nieparzysta suma, chyba trzeba sprawdzic 2 opcje } if (rogGorny[dim] - rogDolny[dim] == 1){ rogGorny[dim] += MAX_INT; rogDolny[dim] -= MAX_INT; czyCieplo(rogGorny); if (czyCieplo(rogDolny)){//lepszy jest dolny rogGorny[dim]--; } else {//lepszy jest gorny rogDolny[dim]++; } rogGorny[dim] -= MAX_INT; rogDolny[dim] += MAX_INT; total += 2; return 1; };//ujednolic midPocz[dim] = rogDolny[dim]; midKon[dim] = rogGorny[dim]; int middle = (midPocz[dim] + midKon[dim])/2; czyCieplo(midPocz); total += 2; if (czyCieplo(midKon) == 1) { rogDolny[dim] = middle + 1; return 1; }; total += 1; if (czyCieplo(midPocz) == 1) { rogGorny[dim] = middle;//gdyz odpowiedz bedize prawdziwa tylko jesli bedize ostra nierownosc return 1; }; return 0; } /* void dostosuj(){ for(int i = 0; i < d; i++) {wynik[i] = rogDolny[i];} for(int i = 0; i < d; i++){ rogGorny[i]++; czyCieplo(rogGorny); rogGorny[i]--; if (czyCieplo(rogDolny) == 0) wynik[i]++;//bo wysuniecie nie pogorszylo, czyli trzeba podbic } }*/ void print(){ for(int i = 0; i < d; i++){printf("%d ",rogDolny[i]);} printf("\n"); for(int i = 0; i < d; i++){printf("%d ",rogGorny[i]);} printf("\n"); } int main(){ int iteracje = 0; //freopen("test_auto.txt","r", stdin); d = podajD(); k = podajK(); r = podajR(); for(int i = 0; i < d; i++) {rogDolny[i] = 0;rogGorny[i] = r;} //print(); while(rozneRogi()){ int poprawil = 0; //printf("+++++++++++++++++++++++++++++++++++ITERACJA %d\n",total); iteracje++; for(int i = 0; i < d; i++) { if (zaciesnia(i)){ //printf("WYMIAR %d\n",i); //print(); poprawil = 1; //break; } } // assert(poprawil == 1); if (poprawil == 0) break;//to oznacza ze punkt jest na przecieciu wszystkich wymairow } //printf("KONIEC %d %d\n",total, iteracje); //print(); //if (kostka()){ // printf("KOSTKA\n"); // dostosuj(); //} else { //printf("==============================================\n"); for(int i = 0; i < d; i++) wynik[i] = (rogDolny[i] + rogGorny[i])/2;//mozemy nie skonczyc w punkcie //} znalazlem(wynik); //fclose(stdin); 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 123 124 125 126 127 128 | #include <stdio.h> #include <assert.h> #include <stdlib.h> #include "cielib.h" #define MAX_INT 1000000000 #define OVER_MAX_INT 1000000000 #define MAX_DIM 600 int rogDolny[MAX_DIM]; int rogGorny[MAX_DIM]; int wynik[MAX_DIM]; int mid[MAX_DIM]; int k,d,r; int total; int rozneRogi(){ for(int i = 0; i < d; i++) if (rogDolny[i] != rogGorny[i]) return 1; return 0; } /* int kostka(){ int res = 0; for(int i = 0; i < d; i++) if (abs(rogDolny[i] - rogGorny[i]) == 1) res++; assert(res == 0 || res == d); return res == d; }*/ int zaciesnia(int dim){ int midPocz[MAX_DIM]; int midKon[MAX_DIM]; if (rogDolny[dim] == rogGorny[dim]) return 0; for(int i = 0; i < d; i++){ midPocz[i] = midKon[i] = (rogDolny[i] + rogGorny[i]) / 2;//nie wiadomo co zrobic z nieparzysta suma, chyba trzeba sprawdzic 2 opcje } if (rogGorny[dim] - rogDolny[dim] == 1){ rogGorny[dim] += MAX_INT; rogDolny[dim] -= MAX_INT; czyCieplo(rogGorny); if (czyCieplo(rogDolny)){//lepszy jest dolny rogGorny[dim]--; } else {//lepszy jest gorny rogDolny[dim]++; } rogGorny[dim] -= MAX_INT; rogDolny[dim] += MAX_INT; total += 2; return 1; };//ujednolic midPocz[dim] = rogDolny[dim]; midKon[dim] = rogGorny[dim]; int middle = (midPocz[dim] + midKon[dim])/2; czyCieplo(midPocz); total += 2; if (czyCieplo(midKon) == 1) { rogDolny[dim] = middle + 1; return 1; }; total += 1; if (czyCieplo(midPocz) == 1) { rogGorny[dim] = middle;//gdyz odpowiedz bedize prawdziwa tylko jesli bedize ostra nierownosc return 1; }; return 0; } /* void dostosuj(){ for(int i = 0; i < d; i++) {wynik[i] = rogDolny[i];} for(int i = 0; i < d; i++){ rogGorny[i]++; czyCieplo(rogGorny); rogGorny[i]--; if (czyCieplo(rogDolny) == 0) wynik[i]++;//bo wysuniecie nie pogorszylo, czyli trzeba podbic } }*/ void print(){ for(int i = 0; i < d; i++){printf("%d ",rogDolny[i]);} printf("\n"); for(int i = 0; i < d; i++){printf("%d ",rogGorny[i]);} printf("\n"); } int main(){ int iteracje = 0; //freopen("test_auto.txt","r", stdin); d = podajD(); k = podajK(); r = podajR(); for(int i = 0; i < d; i++) {rogDolny[i] = 0;rogGorny[i] = r;} //print(); while(rozneRogi()){ int poprawil = 0; //printf("+++++++++++++++++++++++++++++++++++ITERACJA %d\n",total); iteracje++; for(int i = 0; i < d; i++) { if (zaciesnia(i)){ //printf("WYMIAR %d\n",i); //print(); poprawil = 1; //break; } } // assert(poprawil == 1); if (poprawil == 0) break;//to oznacza ze punkt jest na przecieciu wszystkich wymairow } //printf("KONIEC %d %d\n",total, iteracje); //print(); //if (kostka()){ // printf("KOSTKA\n"); // dostosuj(); //} else { //printf("==============================================\n"); for(int i = 0; i < d; i++) wynik[i] = (rogDolny[i] + rogGorny[i])/2;//mozemy nie skonczyc w punkcie //} znalazlem(wynik); //fclose(stdin); return 0; } |