Domande riguardo esercizi territoriali

Buon giorno, volevo fare due domande riguardo gli esercizi territoriali:
I seguenti esercizi possono essere fatti come si vuole (sempre al fine di risolvere l’esercizio) o nell’esercizio viene o potrebbe essere specificato qualche condizione da rispettare?
Poi ho notato che nei esercizi ci sono delle subtask da fare:
Sono tipo delle cose secondarie che bisogna fare nel codice e che ti danno più punti per quel esercizio?

In genere le uniche condizioni specificate negli esercizi sono il problema stesso e il formato di output. Ci sono altre condizioni come ad esempio il linguaggio di programmazione da usare e non barare. (non sono molto informato a riguardo, bisognerebbe vedere i regolamenti delle territoriali ma non so dove siano)
Se un problema e’ suddiviso in subtask, in genere c’e’ scritto ogni subtask quanti punti ti da. Non sono cose aggiuntive, bensi delle sottoparti del problema, quindi anche se non riesci a risolvere il problema completamente, magari riesci a risolverlo per certi subtask con certe condizioni (ad esempio N piccolo) e ricavare dei punti dal problema anche se non lo completi.

1 Mi Piace

Alle territoriali solitamente non sono previsti subtask veri e propri. A volte però nel testo del problema ci sono delle “assunzioni aggiuntive” che valgono solo per alcuni casi di input.

Per capire bene a cosa mi riferisco vai su https://territoriali.olinfo.it/ e prova a fare qualche problema (sono quelli delle territoriali degli ultimi anni). Per esempio nel problema Pile (Impila le scatole):

Nei primi 2 casi di test valgono le seguenti assunzioni aggiuntive:
A = B = C

Questo vuol dire che i tre numeri sono sicuramente uguali nei primi due casi di test, mentre negli altri casi potrebbero essere diversi. Queste assunzioni aggiuntive sono volte a semplificare il problema, andando a focalizzarsi solo su casi particolari (più semplici del problema generale).

In questa selezione ogni caso di test vale uguale, quindi se risolvi correttamente l’X% dei casi otterrai l’X% dei punti, qualunque siano questi casi risolti.


Rispondendo più nello specifico alle prime due domande invece:

I seguenti esercizi possono essere fatti come si vuole (sempre al fine di risolvere l’esercizio)

Diciamo di “sì”, nel senso che la soluzione potrebbe non essere unica, sia come algoritmo usato, sia come “output” prodotto. Però se rispetta tutti i requisiti descritti dal testo il sistema l’accetterà come valida.

nell’esercizio viene o potrebbe essere specificato qualche condizione da rispettare

Visto che la correzione è automatizza, è estremamente importante rispettare il formato descritto dal testo. Nel testo di ogni problema è descritto quello che va stampato nel file di output, e sono sempre presenti degli esempi. Attenzione quindi a non scrivere nulla che non sia stato esplicitamente richiesto. Quindi, per esempio, non bisogna scrivere in output "Inserisci primo numero: ".

Ovviamente tutto ciò assumendo la sportività e l’osservanza del regolamento. Copiare o far copiare, per esempio, porta alla squalifica! (e sfortunatamente è già successo più volte che siamo dovuti arrivare a tanto)

Perciò, evitare assolutamente righe di abbellimento tipo output? fare solo codice di algoritmo, giusto?
Poi eventuali input, devono esserci pure giusto?

Ad esempio ho provato a fare questo esercizio: CMSocial - a social coding app

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

using namespace std;

int main()
{
	string ip1,ip2,ip3,ip4;
	ofstream FileI("Input.txt");
	ofstream FileO("Output.txt");
	cout<<"Inserisci il primo ip"<<endl;
	
	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);
	
	int ipi1=stoi(ip1),ipi2=stoi(ip2),ipi3=stoi(ip3),ipi4=stoi(ip4);
	long long int pac=0;
	
	while(ipi1>255 || ipi2>255 || ipi3>255|| ipi4>255)
	{
		cout<<"Una parte dell'ip non è valida, inserire valori minori di 256"<<endl;
		getline(cin,ip1,'.');
		getline(cin,ip2,'.');
		getline(cin,ip3,'.');
		getline(cin,ip4);
		ipi1=stoi(ip1),ipi2=stoi(ip2),ipi3=stoi(ip3),ipi4=stoi(ip4);
	}
	
	FileI<<ip1<<".";
	FileI<<ip2<<".";
	FileI<<ip3<<".";
	FileI<<ip4<<endl;
	
	cout<<"Inserisci il secondo ip"<<endl;
	
	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);
	
	int ipi12=stoi(ip1),ipi22=stoi(ip2),ipi32=stoi(ip3),ipi42=stoi(ip4);
	
	while(ipi12>255 || ipi22>255 || ipi32>255|| ipi42>255)
	{
		cout<<"Una parte dell'ip non è valida, inserire valori minori di 256"<<endl;
		getline(cin,ip1,'.');
		getline(cin,ip2,'.');
		getline(cin,ip3,'.');
		getline(cin,ip4);
		ipi12=stoi(ip1),ipi22=stoi(ip2),ipi32=stoi(ip3),ipi42=stoi(ip4);
	}
	FileI<<ip1<<".";
	FileI<<ip2<<".";
	FileI<<ip3<<".";
	FileI<<ip4<<endl;
	
	if(ipi12>ipi1)
		ipi1=ipi12-ipi1;
	else
		ipi1=ipi1-ipi12;
		
	if(ipi22>ipi2)
		ipi2=ipi22-ipi2;
	else
		ipi2=ipi2-ipi22;
		
	if(ipi32>ipi3)
		ipi3=ipi32-ipi3;
	else
		ipi3=ipi3-ipi32;
		
	if(ipi42>ipi4)
		ipi4=ipi42-ipi4;
	else
		ipi4=ipi4-ipi42;
		
	pac=ipi4+(ipi1*pow(256,3))+(ipi2*pow(256,2))+(ipi3*256)+1;
	FileO<<pac<<endl;	
}

Però dandogli questo codice da 0/100, cosa non va? Forse devo fare i subtask dato che la sola realizzazione degli esempi mi da 0 punti?

Yes, questo genere di cose (cout<<"Inserisci il primo ip"<<endl;) dà molto fastidio al correttore automatico, quindi non vanno messe.

Non ho capito cosa intendi.

Come nel codice, vede che ci sono delle getline? Le devo mettere? Stessa cosa i cin(che non ci sono nel codice)? Ho fatto altre domande alla fine del messaggio di prima

esempio (easy1): questo problema ti da N, N interi e ti chiede di trovare il massimo tra questi.

#inlclude <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  cin>>n;
  vector<int> v(n);
  for(int i=0; i<n; i++) cin>>v[i];
  int ma=*max_element(v.begin(),v.end());
  cout<<ma<<endl;
  return 0;
}

Come puoi notare non stampo linee del tipo “Scrivi N in input”.
Uso stdin e stdout ma alle territoriali se ti e’ piu comodo puoi usare io da file su disco.
Personalmente ti consiglio di usare cin>> invece di getline in genere.

1 Mi Piace

Ok grazie. Però ho un grande problema: Come vedi prima ho messo un codice che mi 0/100 su questo esercizio. Io non so cosa si deve fare quando si ha 0/100. Stessa mi è capitata con un altro codice. Il punto è che fanno quello che devono, ma non capisco perché non li accetta. Mi hanno detto di controllare la tabella(quella che spunta quando clicchi l’id del tentativo) ma tutto mi spunta o incorretto od output non corretto. Perciò chiedo gentilmente, se possibile, di spiegarmi come ci si bisogna comportare in caso un esercizio, dal punto di vista logico funziona, ma dal punto di vista del punteggio no.

sul cms quasi sempre i problemi ti chiedono di usare stdio, togli la roba dei file e le stampe inutili e usa cin,cout.

1 Mi Piace

Grazie mille. Le stampe inutili le ho già tolte e qua ci siamo. Con “togli la roba dei file e le stampe inutili e usa cin,cout.” intendi di togliere le righe di creazione dei file e lascio solo i cin, e poi i cout che stampano quello che voleva sul file output? Poi in che senso ti chiedono di usare stdio? intendi la libreria?

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

using namespace std;

int main()
{
	string ip1,ip2,ip3,ip4;
	ofstream FileI("Input.txt");
	ofstream FileO("Output.txt");
		
	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);
	
	int ipi1=stoi(ip1),ipi2=stoi(ip2),ipi3=stoi(ip3),ipi4=stoi(ip4);
	long long int pac=0;
	
	while(ipi1>255 || ipi2>255 || ipi3>255|| ipi4>255)
	{
		getline(cin,ip1,'.');
		getline(cin,ip2,'.');
		getline(cin,ip3,'.');
		getline(cin,ip4);
		ipi1=stoi(ip1),ipi2=stoi(ip2),ipi3=stoi(ip3),ipi4=stoi(ip4);
	}
	
	FileI<<ip1<<".";
	FileI<<ip2<<".";
	FileI<<ip3<<".";
	FileI<<ip4<<endl;
	
	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);
	
	int ipi12=stoi(ip1),ipi22=stoi(ip2),ipi32=stoi(ip3),ipi42=stoi(ip4);
	
	while(ipi12>255 || ipi22>255 || ipi32>255|| ipi42>255)
	{
		getline(cin,ip1,'.');
		getline(cin,ip2,'.');
		getline(cin,ip3,'.');
		getline(cin,ip4);
		ipi12=stoi(ip1),ipi22=stoi(ip2),ipi32=stoi(ip3),ipi42=stoi(ip4);
	}
	FileI<<ip1<<".";
	FileI<<ip2<<".";
	FileI<<ip3<<".";
	FileI<<ip4<<endl;
	
	if(ipi12>ipi1)
		ipi1=ipi12-ipi1;
	else
		ipi1=ipi1-ipi12;
		
	if(ipi22>ipi2)
		ipi2=ipi22-ipi2;
	else
		ipi2=ipi2-ipi22;
		
	if(ipi32>ipi3)
		ipi3=ipi32-ipi3;
	else
		ipi3=ipi3-ipi32;
		
	if(ipi42>ipi4)
		ipi4=ipi42-ipi4;
	else
		ipi4=ipi4-ipi42;
		
	pac=ipi4+(ipi1*pow(256,3))+(ipi2*pow(256,2))+(ipi3*256)+1;
	FileO<<pac<<endl;	
}

Ora è cosi il codice. Se vuoi, se ti viene meglio, evidenziami le righe che toglieresti citandomele e cosa modificheresti.

non ho bene capito cosa fai nella tua soluzione e non ho voglia di guardarci con attenzione quindi l’ho semplificata un po.

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string ip1,ip2,ip3,ip4;

	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);

	long long ipa = stoi(ip1)*256ll*256*256+stoi(ip2)*256*256+stoi(ip3)*256+stoi(ip4);
	
	getline(cin,ip1,'.');
	getline(cin,ip2,'.');
	getline(cin,ip3,'.');
	getline(cin,ip4);
	
	long long ipb = stoi(ip1)*256ll*256*256+stoi(ip2)*256*256+stoi(ip3)*256+stoi(ip4);

	cout<<abs(ipa-ipb)+1<<endl;
}

stdio sta per standard input / output, che sono due file che ti da sempre il sistema operativo, sono quelli che usano cin e cout e che vedi a console. (fyi c’e’ anche cerr che stampa su stderr).
Come puoi vedere:

  • non uso file
  • non faccio loop per prendere l’input finche’ non e’ giusto, questo te lo assicura il problema
1 Mi Piace

Ok grazie ora ho capito. Prima credevo che bisognava fare uso di queste cose. Grazie mille. Ora mi da 100/100.