• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

1299 Stefan Pomoc potrzebna

Aruba Cloud - Virtual Private Server VPS
0 głosów
308 wizyt
pytanie zadane 22 sierpnia 2017 w C i C++ przez Paweł Kiełb Nowicjusz (120 p.)

http://pl.spoj.com/problems/FZI_STEF/

 

Ktoś powie gdzie jest błąd?

 

// ConsoleApplication5.cpp: Definiuje punkt wejścia dla aplikacji konsolowej.
//

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <cmath>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int *x;
int x2;
int i;
int p1;
int p2;
int i2;
int* m;
int* m2;
int z=1;
int i3;
int i4;

int checktop(int c) {
	for (i2 = 0, p1 = 0, p2 = 0; i2 < c; i2++, x++)
		p1 += *x;
	x = m;
	return p1;
}


int checkdown(int c2) {
	x = x + (x2 - c2);
	for (i2 = 0, p1 = 0, p2 = 0; i2 < c2; i2++, x++)
		p1 += *x;
	x = m;
	return p1;
}

int checkall() {
	x = m;
	for (i2 = 0, p1 = 0, p2 = 0; i2 < x2; i2++,x++) {
		p1 += *x;
		
	}
	x = m;
	return p1;
}

void cutofftop(int c) {
	m = m + c;
	x = m;
	x2 = x2 - c;
}

void cutoffdown(int c) {
	x2 = x2 - c;
}

int sercz() {
	z = 0;
	int *xc = m;
	int *xc2 = m;
	x = m;
	int y;
	y = checkall();
	for (i3 = 1; i3 < (x2+1); i3++, xc++) {
		//cout << *xc << endl;
		if (*xc < 0) {
			if (checkdown(x2 - i3) > y)
				if (checktop(i3 - 1) > checkdown(x2 - i3)) {
					xc2 += x2;
					for (i4 = x2; i4 > i3 + 1; i4++, xc2--) {
						if (*xc2 < 0) { cutoffdown(abs(i4 - x2) + 1); z = 1; break; }
					}
					if (z == 0) {
						cutoffdown(x2 - i3 + 1);
						z = 1;
						break;
					}
				}
				else {
					//for (i4 = x2; i4 > i3 + 1; i4++, xc2--) {
					//	if (*xc2 < 0) { cutoffdown(abs(i4 - x2) + 1); z = 1; break; }
					//}
					//if (z == 0) {
						cutofftop(i3);
						z = 1;
						break;
				}
			else if (checktop(i3-1) > y) {
				xc2 += x2;
				for (i4 = x2; i4 > i3 + 1; i4++, xc2--) {
					if (*xc2 < 0) { cutoffdown(abs(i4 - x2) + 1); z = 1; break;}
				}
				if (z == 0) {
					cutoffdown(x2 - i3 + 1);
					z = 1;
					break;
				}
			}
		}
	}
	x = m;
	return 1;	
}




int main() {
	cin >> x2;
	x = new int[x2];
	m = x;
	m2 = x;
	for (i = 0; i < x2; i++, x++) cin.ignore(), cin >> *x;
	x = m;
	while (z == 1) sercz();
	cout << checkall() << endl;
	x = m2;
	delete[] x;
	return 0;
}

 

komentarz 22 sierpnia 2017 przez vector Dyskutant (9,200 p.)

Nikt Ci nie pomoże patrząc jak bardzo "piękny" jest ten kod. W dodatku nawet nie opisałeś w czym problem, nie podałeś przypadku testowego dla którego to nie działa.

 

Tak przy okazji to WTF ? takie proste zadanie a taki długi program. Możesz sobie poczytać largest sum contiguous subarray

komentarz 22 sierpnia 2017 przez Paweł Kiełb Nowicjusz (120 p.)
problem taki, że błędna odpowiedź, jak zdobyć ten przypadek testowy?
komentarz 22 sierpnia 2017 przez manjaro Nałogowiec (37,390 p.)
edycja 22 sierpnia 2017 przez manjaro
U mnie śmiga na 1 pętli, 4 zmiennych i ogólnie 19 linijkach całego kodu. A pewnie jeszcze dałoby radę zmniejszyć to o połowę ;)

Nie chce mi się analizować tego kodu co napisałeś bo to masakra jakaś ale na oko widzę że na intach tego nie da się zrobić.
komentarz 23 sierpnia 2017 przez Ehlert Ekspert (214,940 p.)
Spojowy kompilator zwymiotował po 24 linijce.
komentarz 23 sierpnia 2017 przez draghan VIP (106,230 p.)
Uwaga porządkowa: nie podałeś w treści opisu problemu. Tytuł pytania nie mówi kompletnie nic. Gdyby nie odpowiedzi niżej, usunąłbym temat. Na przyszłość zwracaj uwagę na wskazówki, które się wyświetlają przy zadawaniu pytania.

2 odpowiedzi

+1 głos
odpowiedź 22 sierpnia 2017 przez seba Dyskutant (8,900 p.)
Mistrzem nie jestem ale zrobiłem to zdanie na 17 linijkach i mi zaliczyło, więc usuń to wszystko i zacznij od nowa, najlepiej na kartce, testuj krok po kroku.
1
komentarz 23 sierpnia 2017 przez vector Dyskutant (9,200 p.)
edycja 23 sierpnia 2017 przez vector

Uznałem to za wyzwanie na pojedynek ;) Udało mi się napisać przechodzący program na spoju w 120 znakach, da się jeszcze o dużo zejść w dół, mianowicie moja metoda nie jest optymalna ale nie chciałem na to zbyt dużo czasu poświęcać ;)

Oto kod

#include<stdio.h>
(*z)()=u"啁呁襉嗵ㅓ㇭䧛ﲉ쀱荈ᣬר\0─汬d䡟a䣔ҋ䠤傍䣿삅襈␔⥴쀱赈⑴\0氥摬开a䣔尃ࠤॸ㥈䣝䰏㇊䣆ۨ\0─汬੤开쀱a䣕쒃嬘䅝䅜썝";main(){z(scanf,printf);}

// Edit 116 znaków

#include<stdio.h>
(*z)()=u"啁呁襉嗵\0氥摬䄀ㅞ㇭䧛ﲉ쀱荈ᣬ襌䣷噁a䇔䡞ҋ䠤傍䣿삅襈␔╴쀱赈⑴䰈噁a䇔䡞尃ࠤॸ㥈䣝䰏㇎䣊襌ㇷ䇀헿荈ᣄ嵛屁嵁쎐";main(){z(scanf,printf);}

 

komentarz 23 sierpnia 2017 przez seba Dyskutant (8,900 p.)

Ładnie wink, mi wyszło 147 znaków, z czego drugi programista przynajmniej się rozczyta laugh

0 głosów
odpowiedź 23 sierpnia 2017 przez Jonki Dyskutant (8,180 p.)
Ja z algorytmiki kompletnie leżę, ale i tak wpadłem od razu na lepszy pomysł.

Zliczaj sobie w pętli liczby dodatnie do wystąpienia ujemnej i dodawaj do listy. Potem tylko posortować listę i wyświetlić tą ostatnią największą wartość.
komentarz 23 sierpnia 2017 przez Aisekai Nałogowiec (42,190 p.)
Coś takiego raczej by nie zadziałało, jeśli za liczbą ujemną (albo paroma liczbami ujemnymi) suma dodatnich liczb i tych ujemnych była większa od 0 bo dotychczasowy max by się jeszcze zwiększył o tą dodatnia sumę.

Podobne pytania

0 głosów
2 odpowiedzi 331 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez cza213 Początkujący (370 p.)
–1 głos
2 odpowiedzi 515 wizyt
pytanie zadane 28 sierpnia 2016 w C i C++ przez pewien_programista Obywatel (1,070 p.)
+1 głos
3 odpowiedzi 1,350 wizyt
pytanie zadane 29 lipca 2016 w C i C++ przez mat1911 Nowicjusz (230 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...