nyoj 笨蛋的难题()二 题解

来源:互联网 发布:js选择框选择触发事件 编辑:程序博客网 时间:2024/04/29 23:43

/*
这是我开始的做法,两层循环,
其实存在思路不够好,存在大量冗余,导致时间超了
 

#include<iostream>using namespace std;#include<cstdio>#include<cstring>#include<cstdlib>#define N 125int n;int sum[N];int f[N],a[N],d[N],r[N];int main(){    while (~scanf("%d",&n))    {    int i,j,t,k;        for (i=1;i<=n;++i)    {        scanf("%d",&a[i]);        sum[i]=sum[i-1]+a[i];    }        f[n]=a[n];    d[n]=n;    r[n]=0;        for (i=n-1;i>0;--i)              {        for (j=i;j<=n;++j)            if (f[i]<a[j]+r[j+1])            {               f[i]=a[j]+r[j+1];               d[i]=j;               }        k=i;         t=0;        while (k<=n)        {              t+=sum[d[k]-1]-sum[k-1];              k=d[k]+1;                   }                    r[i]=sum[n]-sum[i-1]-t-f[i];                }                    printf("%d %d %d \n",f[1],r[1],t);                  memset(sum,0,sizeof(sum));    memset(f,0,sizeof(f));    memset(d,0,sizeof(d));    memset(r,0,sizeof(r));    }         return 0;}


*/


/*
正解应该是dp,类似于最大子串和, 实现时通过降维可以不用数组


两个数组f[i],g[i],分别表示笨蛋和傻子从第i小时开始的最大工资


f[i]=max(g[i-1]+a[i],f[i-1]) 
如果f[i]= g[i-1]+a[i],则g[i]=f[i-1]


显然可以降维,不用数组,用两个变量即可。 
*/ 
 
#include<iostream>using namespace std;#include<cstdio>#include<cstring>#include<cstdlib>#define N 125int n,sum;int a[N];int main(){     while (~scanf("%d",&n))    {    int i,j,t,k;        sum=0;        for (i=1;i<=n;++i)    {        scanf("%d",&a[i]);        sum=sum+a[i];    }        int max1=0,max2=0,tmp;        for (i=n;i>0;--i)        if (a[i]+max2>=max1)        {        tmp=max1;        max1=a[i]+max2;        max2=tmp;                                      }        printf("%d %d %d\n",max1,max2,sum-max1-max2);    }    return 0; }

























0 0
原创粉丝点击