33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_COUNT 1000
int data[MAX_COUNT];
int seqdata[MAX_COUNT];
int dataindex[MAX_COUNT];
int seqdataindex[MAX_COUNT];
int seqnextindex[MAX_COUNT];
int seqprevindex[MAX_COUNT];
int beforeindex[MAX_COUNT];
int afterindex[MAX_COUNT];
int maxret[MAX_COUNT];
int count = 10;
char *files[]={"test.in","test.input","test.sort","test.relate","test.ret"};
void display_to_file(char *file)
{
int i;
FILE *pf;
if(file == 0)return;
pf = fopen(file,"w");
fprintf(pf," => data ind seqdata ind >ind <ind ret<=\n");
for(i=0;i<count;i++)
{
fprintf(pf,"%3d %10d %3d %10d %3d %3d %3d %10d\n",
i,data[i],dataindex[i],seqdata[i],seqdataindex[i],
afterindex[i],beforeindex[i],maxret[i]);
}
fclose(pf);
}
void input(char* file) /*data*/
{
int i;
if(file == 0)
{
srand(time(0));
for(i=0;i<count;i++)
{
data[i] = rand() % 10000;
seqdata[i] = data[i];
dataindex[i] = i;
seqdataindex[i] = i;
}
}
else
{
FILE *pf = fopen(file,"r");
if(pf == 0)
{
count = 10;
input(0);
}
fscanf(pf,"%d",&count);
for(i=0;i<count;i++)
{
fscanf(pf,"%d",&data[i]);
seqdata[i] = data[i];
dataindex[i] = i;
seqdataindex[i] = i;
}
fclose(pf);
}
display_to_file("test.input");
}
int qstestdummyf[MAX_COUNT];
int qstestdummyi[MAX_COUNT];
void qstest(int left, int right)
{
int mid = (left+right)/2;
int l,r,i;
if(left >= right) return;
if(left == right - 1)
{
if(seqdata[left]>seqdata[right])
{
int tmpf = seqdata[left];
int tmpi = seqdataindex[left];
seqdata[left] = seqdata[right];
seqdataindex[left] = seqdataindex[right];
seqdata[right] = tmpf;
seqdataindex[right] = tmpi;
}
return;
}
qstest(left,mid);
qstest(mid+1,right);
l = left;
r = mid+1;
for(i=left;i<=right;i++)
{
if(r<=right && (l>mid || seqdata[l]>seqdata[r]) )
{
qstestdummyf[i] = seqdata[r];
qstestdummyi[i] = seqdataindex[r];
r++;
}
else
{
qstestdummyf[i] = seqdata[l];
qstestdummyi[i] = seqdataindex[l];
l++;
}
}
for(i=left;i<=right;i++)
{
seqdata[i] = qstestdummyf[i];
seqdataindex[i] = qstestdummyi[i];
}
}
void getsortinfo()/*seqdata dataindex seqdataindex*/
{
int i;
qstest(0,count-1);
for(i=0;i<count;i++)
{
dataindex[ seqdataindex[i] ] = i;
}
display_to_file("test.sort");
}
void initseqindex()/*seqnextindex seqprevindex*/
{
int i;
for(i=0;i<count;i++)
{
seqnextindex[i] = i+1;
seqprevindex[i] = i-1;
}
}
void getrelatedinfo()/*beforeindex afterindex*/
{
int i,index;
initseqindex();
for(i=0;i<count;i++)
{
index = dataindex[i];
if(seqnextindex[index]>=0 && seqnextindex[index]<count)
afterindex[i] = seqdataindex[ seqnextindex[index] ];
else afterindex[i] = seqnextindex[index];
seqnextindex[ seqprevindex[index] ] = seqnextindex[index];
seqprevindex[ seqnextindex[index] ] = seqprevindex[index];
}
initseqindex();
for(i=count-1;i>=0;i--)
{
index = dataindex[i];
if(seqprevindex[index]>=0 && seqprevindex[index]<count)
beforeindex[i] = seqdataindex[ seqprevindex[index] ];
else beforeindex[i] = seqprevindex[index];
seqnextindex[ seqprevindex[index] ] = seqnextindex[index];
seqprevindex[ seqnextindex[index] ] = seqprevindex[index];
}
display_to_file("test.relate");
}
int getanswerflag[MAX_COUNT];
int getanswer()/*maxret*/
{
int ret = 0;
int i;
for(i=0;i<count;i++)
getanswerflag[i] = 0;
for(i=0;i<count;i++)
{
if(getanswerflag[i] == 0)
{
getanswerflag[i] = 1;
if(beforeindex[i] == -1)
maxret[i] = 0;
else maxret[i] = maxret[beforeindex[i]]+data[beforeindex[i]];
}
if(afterindex[i] == count)
{
if(ret<maxret[i]+data[i])ret=maxret[i]+data[i];
}
else
{
if(getanswerflag[afterindex[i]]==0)
{
maxret[afterindex[i]]=maxret[i]+data[i];
getanswerflag[afterindex[i]]=1;
}
else if(maxret[afterindex[i]]<maxret[i]+data[i])
maxret[afterindex[i]]=maxret[i]+data[i];
}
/*
{
char buff[]="??test.ret";
buff[0] = i/10 + '0';
buff[1] = i%10 + '0';
display_to_file(buff);
}
*/
}
display_to_file("test.ret");
return ret;
}
/*
data[0]....data[n] input data
using sort to get follow O(n(log n))
seqdata[0]....seqdata[n] sorted data
dataindex / seqdataindex
seqdata[ dataindex[i] ] = data[ i ]
data [seqdataindex[i] ] = seqdata[ i ]
seqnextindex / seqprevindex help to get follow O(n)
beforeindex / afterindex
data[ beforeindex[i] ] = max{data[0]..data[i-1]}<data[i]
data[ afterindex[i] ] = min{data[i+1]..data[n]}>data[i]
to get result O(n)
maxret[i] max result before data[i] and data[i] can be add in
*/
int main(int argc, char* argv[])
{
int ret;
if(argc == 1)
input("test.in");
else if(argc == 2)
{
sscanf(argv[1],"%d",&count);
input(0);
}
getsortinfo();
getrelatedinfo();
ret = getanswer();
printf("result: %d\n",ret);
return 0;
}