Pagini recente » Cod sursa (job #262356) | Cod sursa (job #1149372) | Cod sursa (job #115129) | Cod sursa (job #181755) | Cod sursa (job #742056)
Cod sursa(job #742056)
// http://infoarena.ro/problema/buline
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
long N, i, j, k, maxx, kp = 0, pp = 0, jp = 0;
int *v, *dp;
FILE *f = fopen("buline.in", "r");
fscanf(f, "%d", &N);
v = (int*)malloc(N * 2 * sizeof(int));
dp = (int*)malloc(N * 2 * sizeof(int));
int semn;
for (i = 0; i < N; ++i)
{
fscanf(f, "%d %d", &v[i], &semn);
if(semn == 0) v[i] *= -1;
v[i+N] = v[i];
}
maxx = v[0];
fclose(f);
bool sc = false;
long r = 0;
for(k = 0; k < N; ++k)
{
dp[0+r] = v[k];
for (i = k + 1; i < N + k; ++i)
{
j = i - k;
if(dp[r+j-1] > 0)
{
dp[r+j] = dp[r+j-1] + v[i];
if(maxx < dp[r+j])
{
maxx = dp[r+j];
pp = i;
kp = r;
jp = j;
sc = true;
}
}
else
{
dp[r+j] = v[i];
if(maxx < dp[r+j])
{
maxx = dp[r+j];
kp = r;
pp = i;
jp = j;
sc = true;
}
}
}
if(sc)
{
if(r == 0) r = N;
else r = 0;
sc = false;
}
}
k = 1;
while(true)
{
if(pp == 0 || dp[kp+jp] - v[pp] != dp[kp+jp-1]) break;
pp--;
jp--;
k++;
}
f = fopen("buline.out", "w");
fprintf(f, "%d %d %d", maxx, pp + 1, k);
fclose(f);
return 0;
}