На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Дуже хочеться знайти свої помилки, але смостійно це зробити не можу, може тут хтось мені допоможе.
Calculation
#include <iostream> using namespace std; unsigned long long int a, b, result = 0; short int c[18]; short int numbers = 0; int rekuw_pow(short int number, short int power); int main() { //cout << "Input numbers: "; cin >> a >> b; for(short int i = 0; b != 0; i++, b=b/10) { c[i] = b%10; numbers++; } for(short int j = 0; j < numbers; j++) { // cout << c[j]; } //cout << endl; for(short int n = 2; n < 10; n++) { result = 0; //cout << "For module " << n << endl; for(short int i = numbers-1, j=1; i >= 0; i--, j++) { result = result + c[i] * rekuw_pow(n, numbers-j); //cout << c[i] * rekuw_pow(n, numbers-j) << " "; } //cout << endl; if(result == a) { cout //<< endl << n; break; } } return 0; } int rekuw_pow(short int number, short int power) { unsigned long long int tempNum = 1; for(int i = 0; i < power; i++) { tempNum = tempNum * number; } return tempNum; }
Rec5
#include <iostream> using namespace std; int main() { int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6 = 0; //cout << "Input: "; cin >> x1 >> y1 >> x2 >> y2; cin >> x3 >> y3 >> x4 >> y4; x5 = max(x1, x3); y5 = min(y1, y3); x6 = min(x2, x4); y6 = max(y2, y4); if(x5 >= x6 && y5>=y6) cout << "0"; else cout << abs (x6 - x5) * abs (y6 - y5); return 0; }
Wall
#include <iostream> using namespace std; short int N, M, K, rul = 1, ost= 0; int main() { //cout << "Input N, M, K: "; cin >> N >> M >> K; short int tempK = K; while(M>0) { if(tempK >= N) { tempK = tempK - N; M--; } if(tempK < N && tempK >= 0) { rul++; ost = tempK + ost; tempK = K - N; M--; } if(M == 0) ost = tempK + ost; } cout << rul << " " << ost; return 0; }
TC100
#include <iostream> using namespace std; bool tanks[200][200]; short int N, M, K, MAX = 0; short int c = 0; int main() { //cout << "Input M, N, K: "; cin >> M >> N >> K; for(short int i = 0; i < M; i++) { for(short int j = 0; j < N; j++) tanks[i][j] = true; } for(int i = 0; i < K; i++) { short int tempX, tempY; // cout << "Input X, Y: " << i+1 << endl; cin >> tempX >> tempY; tanks[tempX-1][tempY-1] = false; } ///Right for(short int m = 0; m < M; m++) { for(short int n = 0; n < N; n++) { if(tanks[m][n] == false) break; c++; } } if(c > MAX) MAX = c; //Left c = 0; for(short int m = 0; m < M; m++) { for(short int n = N-1; n >= 0; n--) { if(tanks[m][n] == false) break; c++; } } if(c > MAX) MAX = c; //Up c = 0; for(short int n = 0; n < N; n++) { for(short int m = 0; m < M; m++) { if(tanks[m][n] == false) break; c++; } } if(c > MAX) MAX = c; //Down c = 0; for(short int n = 0; n < N; n++) { for(short int m = M-1; m >= 0; m--) { if(tanks[m][n] == false) break; c++; } } if(c > MAX) MAX = c; cout << MAX; return 0; }
Figure
#include <iostream> using namespace std; int main() { unsigned int N = 1000000; short int a[8][8] = {0}; short int tempA, tempB = 0; unsigned int max = 0; //cout << "Input N: "; cin >> N; for(short int i = 0; i<N; i++) { cin >> tempA >> tempB; a[tempA-1][tempB-1]++; } for(short int i = 0; i<8; i++) { for(short int j = 0; j<8; j++) { if(max < a[i][j]) max = a[i][j]; } } cout << max; return 0; }
Відредаговано VIRUS (2011-11-17 22:05:34)
Поза форумом
По figure - відповідь не влазить у 2-х-байтовий short (діапазон - [-32768;32767], тоді як за умовою N може бути до 10^6). Із змінною max проблем немає, але перед тим, як записати відповідь у мах, ця відповідь зберігається в масиві а.
Зараз подивлюсь інші задачі.
Поза форумом
По Wall
ці умови:
if(tempK < N && tempK >= 0) { rul++; ost = tempK + ost; tempK = K - N; M--; } if(M == 0) ost = tempK + ost;
треба поміняти місцями(Якщо M уже дорівнює нулю, то немає сенсу додавати ще рулон, навіть якщо (tempK < N && tempK >= 0).)
Поза форумом
Calculation - точно переповнення. Ти знову під час обчислень використовуєш 64-бітні числа, а повертаєш функціями звичайний інт.
Можливо є й ще якісь помилки - докладно не вчитувався ще.
Відредаговано Dim_ov (2011-11-17 21:50:37)
Поза форумом
Dim_ov написав:
По figure - відповідь не влазить у 2-х-байтовий short (діапазон - [-32768;32767], тоді як за умовою N може бути до 10^6). Із змінною max проблем немає, але перед тим, як записати відповідь у мах, ця відповідь зберігається в масиві а.
Це й була засада...
А по Wall цього я не догадався.
Поза форумом
Dim_ov написав:
Calculation - точно переповнення. Ти знову під час обчислень використовуєш 64-бітні числа, а повертаєш функціями звичайний інт.
Можливо є й ще якісь помилки - докладно не вчитувався ще.
Можете привести приклад, бо я щось не можу знайти.
По rec5 x5, x6, y5, y6 - координаты отриманого прямокутника.
Поза форумом
VIRUS написав:
Можете привести приклад, бо я щось не можу знайти.
дивись на функцію
int rekuw_pow(short int number, short int power) { unsigned long long int tempNum = 1; for(int i = 0; i < power; i++) { tempNum = tempNum * number; } return tempNum; }
tempNum має 64-бітний тип. Але коли ти пишеш return - перші 32 біти йдуть лісом, бо rekuw_pow() має тип int.
Поза форумом
Цього я не знав. Я не думав, що це має значення. Але тепер буду знати. До речі, коли я тестував я гадаю все влізало в 32 біти. А ось тут...
Відредаговано VIRUS (2011-11-17 21:59:59)
Поза форумом
по TC100 - скоріш за все, якась дрібниця:
---------- input.txt ---------- 200 200 0 ---------- output.txt ---------- 0
коли правильна відповідь - 40000.
Де саме помилка сказати не можу, в усякому разі, поки не прибереш закоментований код - програму важко сприймати
Поза форумом
Поприбирав
Поза форумом
Ага, здається зрозумів rec5.
Ти очікуєш, що тобі дадуть лівий-нижній та правий-верхній координати прямокутників, коли в умові нічого про це не сказано. А як говорить один із законів Мерфі - "Якщо щось може бути витлумачено кількома способами - воно буде витлумачено найбезглуздішим та найнеймовірнішим з них"
Не варто очікувати від вхідних даних більшого порядку, ніж той, що вказаний у ТУ.
Відредаговано Dim_ov (2011-11-17 22:12:26)
Поза форумом
Я орієнтувався на ТУ, чи Ві хочете сказати що там могли бути і лівий верхній і правий нижній? Якщо так, то як правльно вирішити? У вашому коді мені не дуе вдалося розібратися.
Поза форумом
Dim_ov написав:
У ТС100, здається, теж переповнення.
c має тип short, але за ТУ може приймати значення до 40000. А тип short, на жаль, тільки до 32767
треба було unsigned
Поза форумом
VIRUS написав:
Я орієнтувався на ТУ, чи Ві хочете сказати що там могли бути і лівий верхній і правий нижній? Якщо так, то як правльно вирішити?
Наприклад, якщо вам потрібні правий верхній у x1, y1 та лівий нижній у x2, y2, можна було перевірити:
if(x1<x2)swap(x1,x2); if(y1<y2)swap(y1,y2);
Відредаговано Unknown (2011-11-17 22:18:54)
Поза форумом
В принципі основна проблема - переповнення. Нажаль. Але буду відграватися на наступних турах, хоча вони й складніші.
Поза форумом
Unknown написав:
VIRUS написав:
Я орієнтувався на ТУ, чи Ві хочете сказати що там могли бути і лівий верхній і правий нижній? Якщо так, то як правльно вирішити?
Наприклад, якщо вам потрібні правий верхній у x1, y1 та лівий нижній у x2, y2, можна було перевірити:
Код:
if(x1<x2)swap(x1,x2); if(y1<y2)swap(y1,y2);
(facepalm) а я використовував abs щоб не було від'ємних значень
Поза форумом
VIRUS написав:
Я орієнтувався на ТУ, чи Ві хочете сказати що там могли бути і лівий верхній і правий нижній? Якщо так, то як правльно вирішити? У вашому коді мені не дуе вдалося розібратися.
Ну моя програма, в принципі, теж працює з лівим-нижнім та правим верхнім кутами, але у мене там є шматок коду, який обмінює місцями значення координат, щоб ці умови виконувались.
Але ваша програма, по перше, чекає ще й "правильного" порядку слідування двох прямокутників, а по друге - враховує тільки ті випадки, коли прямокутники перетинаються кутами. А ще може бути, що один прямокутник повністю всередині іншого, або перетинає тільки одну його сторону.
Завтра я намалюю картинку, яка, можливо, трохи пояснить роботу моєї програми. Сьогодні я вже, мабуть іду в оффлайн
Добраніч
Поза форумом
Я перевіряв варіант коли один всередені іншого.
Поза форумом
Ось вам контрприклад для вашого коду Rec5:
27 -135 45 924 74 110 46 236
Відповідь 0.
Поза форумом
Ось ще один, який легше буде намалювати і перевірити:
0 0 7 5 5 1 10 7
Червоним показано відповідь Вашої програми, а зеленим - вірна відповідь. Змінні х5, х6, у5, у6. показано пунктирними лініями
Відредаговано Dim_ov (2011-11-18 13:14:34)
Поза форумом
Вибачте а яку програму Ви використовуєте?
Поза форумом