Cod sursa(job #3240870)

Utilizator domdiridomdidomDominik domdiridomdidom Data 22 august 2024 12:11:59
Problema Subsecventa de suma maxima Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 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";
}

int best[6000000];

void otodik(){
	int kezdet = 1, vege = 1, legnagyobb = 1, maxVege = 1;
	for(int i = 1; i <= n; i++)
		bem >> tomb[i];
	best[0] = 0;
	for(int i = 1; i <= n; i++){
		if(best[i-1] + tomb[i] >= tomb[i]){
			best[i] = best[i-1] + tomb[i];
			vege = i;
		}
		else{
			best[i] = tomb[i];
			kezdet = i;
			vege = i;
		}
		if(best[i] > best[legnagyobb]){
			legnagyobb = i;
			maxVege = vege;
		}
	}
	kim << best[legnagyobb] << " " << kezdet << " " << maxVege << "\n";
}

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