[c++]program z OI

0

witam
Chodzi przykładowo o te zadanie.

Tu jest jego "Najwłaściwsze" rozwiązanie, z strony olimpiady informatycznej

/*************************************************************************
 *                                                                       *
 *                     XVI Olimpiada Informatyczna                       *
 *                                                                       *
 *   Zadanie:  Gasnice (GAS)                                             *
 *   Plik:     gas.cpp                                                   *
 *   Autor:    Piotr Niedzwiedz                                          *
 *   Opis:     Rozwiazanie wzorcowe O(n*k)                               *
 *                                                                       *
 *                                                                       *
 *************************************************************************/

// Headers {{{
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;

#define FOR(I,A,B) for(int I=(A);I<=(B);++I)
#define FORD(I,A,B) for(int I=(A);I>=(B);--I)
#define REP(I,N) for(int I=0;I<(N);++I)
#define VAR(V,init) __typeof(init) V=(init)
#define FORE(I,C) for(VAR(I,(C).begin());I!=(C).end();++I)
#define PB push_back
typedef vector<int> VI;
typedef long long LL;
// }}}

const int nmx=100000;
const int kmx=21;
int n,s,k,result;
LL up[nmx][kmx],need[nmx][kmx];
VI E[nmx];

void dfs(int v,int p){
	FORE(t,E[v]) if(*t!=p){
		dfs(*t,v);
		REP(i,k) up[v][i]+=up[*t][i+1],need[v][i+1]+=need[*t][i];
	}
	need[v][0]=1;
	LL x;
	x=(need[v][k]+s-1)/s;
	up[v][k]=x*s;
	result+=x;
	REP(i,k+1){ x=min(up[v][i],need[v][i]); up[v][i]-=x,need[v][i]-=x;}
	REP(i,k){ x=min(up[v][i+1],need[v][i]); up[v][i+1]-=x,need[v][i]-=x;}
}


int main()
{
	scanf("%d%d%d",&n,&s,&k);
	int a,b;
	REP(i,n-1){
		scanf("%d%d",&a,&b); --a;--b;
		E[a].PB(b); E[b].PB(a);
	}
	dfs(0,-1);
	LL h=0,x;
	FORD(i,k,0){
		h+=up[0][i];
		if (h < need[0][i]){
			x=(need[0][i]-h+s-1)/s;
			result+=x;
			h+=x*s;
		}
		h-=need[0][i];		
	}
	printf("%d\n",result);
	return 0;
}

Mam pytanie odnośnie tego programu, nie konkretnie jak został napisany i jak działa itp.
Chodzi mi o to, czy właściwe jest stosowanie w c++ #define oraz, czy by program by nie działał szybciej jeżeli te pętle by były zapisane na sztywno?

Jeszcze jedno pytanie odnośnie

typedef long long LL;

co to jest jakaś pewnie jakaś zmienna ale jaka i jak to działa?

Z góry dzięki

0
nowy23423 napisał(a)

witam
Mam pytanie odnośnie tego programu, nie konkretnie jak został napisany i jak działa itp.
Chodzi mi o to, czy właściwe jest stosowanie w c++ #define oraz, czy by program by nie działał szybciej jeżeli te pętle by były zapisane na sztywno?

Jeszcze jedno pytanie odnośnie

typedef long long LL;

co to jest jakaś pewnie jakaś zmienna ale jaka i jak to działa?

Z góry dzięki

Jeżeli chodzi o konkursy to warto używać define, gdyż przyspiesza ono pisanie programu, tylko trzeba się wprawić w ich używaniu. Czas jest na przykład bardzo ważny w konkursach typu TopCoder. Program nie działał by szybciej, jedynie szybciej by się kompilował. Używając

typedef long long LL;

po prostu nie musisz pisać całego "long long" wystarczy LL.

0

ale co to jest te LL?
To define w normalnym programowaniu jest dobre?
Jak to wygląda tak na prawdę?
bo to co sobie wymyśla autor to jego sprawa.

0

#typedef long long LL;
w wolnym tlumaczeniu: niech typ long long od teraz nazywa sie LL.
Kompilator każde wystapienie LL będzie traktował jak wystąpienie long long.
Nic więcej.
Czy define jest dobre? Dla zwykłej zmiany nazwy zmiennej (tak jak w kodzie powyżej) może się przydać. W samym C stosuje się to takze to tworzenia "stałych" np.
#define N 100

Ale same makra jako takie, czyli takie niby-funkcje zbudowane na #define są dość zdradliwe i lepiej ich unikać. Latwo zrobić glupi błąd który cięzko potem znaleźć ;)

0

Dzięki za odpowiedz.
To jak by było lepiej(chodzi o szybkość):
używać tego def
napisać na sztywno te pętle
czy napisać funkcje do której zmienne będę wprowadzane przez referencje?

Z tym def nigdy się nie spotkałem.
Chciał bym się dowiedzieć czy warto tym się zainteresować, czy to olać bo to do niczegi się nie przyda?

Zdarza się wam to używać, czy to omijacie?

0

Olej to. Jak kiedyś będziesz potrzebował to sobie użyjesz, bo nie ma w tym nic specjalnego do nauki ;)
Jesli interesują cię konkursy programistyczne to nie zajmuj sie takimi pierdołami. Dobry algorytm zmieści się w czasie nawet stosując bardzo wolne operacje I/O (jak strumienie z C++), a słaby algorytm, choćby ktoś czytał cale wejście / pisał całe wyjście napisanymi przez siebie ultraszybkimi funkcjami, się wyłoży. Skup sie na poprawnym rozwiazywaniu problemów, a nie na wątpliwych optymalizacjach.

0

Dzięki za odpowiedz.
Czyli podsumujmy ogólnie def jest do kitu.
W konkursach informatyczny, ważniejszy od kodu jest algorytm.

Dzięki za pomoc i wytłumaczenie

0

No właśnie zależy też od konkursu. W Polsce najważniejszy konkurs to właśnie OI i w nim liczy się praktycznie tylko algorytm. Ale np. TopCoder High School polega nie tylko na rozwiązaniu problemu ale również szybkim go napisaniu.

0

a czasami wystarczy brut :) ja za to zadanie jak pamiętam dostałem 40 pkt a napisałem 1 linijkę kodu....

0

jaki brut? w sensie zwykły brut? czy to jakiś skrót czy co:d?

0

no taki heurystyczny algorytm w sumie to był bardziej wzór...

0

brut = brute force, przegladanie na chama wszystkich mozliwych/sensownych kombinacji..

0

a jak to działa?

0

co jak działa brut? zazwyczaj źle bo wolno musisz sprawdzić wszystkie kombinacje...

1 użytkowników online, w tym zalogowanych: 0, gości: 1