Cod sursa(job #3242920)

Utilizator domdiridomdidomDominik domdiridomdidom Data 14 septembrie 2024 17:09:03
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <climits>

std::ifstream bem("ssm.in");
int n;
std::ofstream kim("ssm.out");

int tomb[6000001] = {};

void elso(){
	for(int i = 1; i <= n; i++)
		bem >> tomb[i];
	int legnagyobb = INT_MIN, legnagyobbK = 0, legnagyobbV = 0;
	for(int i = 1; i <= n; i++){
		for(int j = i; j <= n; j++){
			int s = 0;
			for(int k = i; k <= j; k++)
				s += tomb[k];
			if(s > legnagyobb){
				legnagyobb = s;
				legnagyobbK = i;
				legnagyobbV = j;
			}
		}
	}
	kim << legnagyobb << " " << legnagyobbK << " " << legnagyobbV << "\n";
}

void masodik(){	
	for(int i = 1; i <= n; i++)
		bem >> tomb[i];
	int legnagyobb = INT_MIN, legnagyobbK = 0, legnagyobbV = 0;
	for(int i = 1; i <= n; i++){
		int s = 0;
		for(int j = i; j <= n; j++){
			s += tomb[j];
			if(s > legnagyobb){
				legnagyobb = s;
				legnagyobbK = i;
				legnagyobbV = j;
			}
		}
	}
	kim << legnagyobb << " " << legnagyobbK << " " << legnagyobbV << "\n";
}

void harmadik(){
	for(int i = 1; i <= n; i++){
		int szam;
		bem >> szam;
		tomb[i] = tomb[i-1] + szam;
	}
	int maxIndexK = 1, maxIndexV = 1;
	for(int i = 1; i <= n; i++){
		for(int j = 0; j < i-1; j++){
			if(tomb[i] - tomb[j] > tomb[maxIndexV] - tomb[maxIndexK]){
				maxIndexK = j;
				maxIndexV = i;
			}
		}
	}
	kim << tomb[maxIndexV] - tomb[maxIndexK] << " " << maxIndexK + 1 << " " << maxIndexV << "\n";
}

// ???
void negyedik(){
	int kezdet = 0, vege = 0;
	for(int i = 1; i <= n; i++){
		int szam;
		bem >> szam;
		tomb[i] = tomb[i-1] + szam;
	}
	int minReszOssz = INT_MAX;
	int jMinReszOssz = -1;
	for(int i = 1; i <= n; i++){
		if(minReszOssz < tomb[i-1]){
			minReszOssz = tomb[i-1];
			kezdet = i;
		}
		if(tomb[i] - minReszOssz > jMinReszOssz){
			jMinReszOssz = tomb[i] - minReszOssz;
			vege = i;
		}
	}
	kim << tomb[vege] - tomb[kezdet] << " " << kezdet << " " << vege << "\n";
}


void otodik(){
	int best = 0, elem, most = 1, max = 0, kezdet, vege;

	for(int i = 1; i <= n; i++){
		bem >> elem;

		if(best + elem >= elem)
			best = best + elem;
		else{
			best = elem;
			most = i;
		}
		if(best > max){
			max = best;
			kezdet = most;
			vege = i;
		}
	}
	kim << max << " " << kezdet << " " << vege << "\n";
}

int main(){
	bem >> n;
	tomb[0] = 0;
	otodik();
	bem.close();
	kim.close();
	return 0;
}