| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1209 人关注过本帖
标题:求AC代码及详细解释(也就是推导思路)
只看楼主 加入收藏
heartnheart
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:335
专家分:1096
注 册:2009-7-10
收藏
得分:0 
额,编程啦刚刚挂了,现在修好了,可以提交了。7楼的我测了,超时╮(╯_╰)╭
2010-07-28 13:10
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:100 
程序代码:
#include <stdio.h>
int Rp[1000001];
main(){  
    int n;
    int i;   
    long long  subRp[2],addRp[2]; //subRp[n%2]与addRp[n%2]存放的是做不做该件事的结果。
    //其中subRp[(n+1)%2]是做下一个事件是减人品,而addRp[(n+1)%2]是涨人品。
    while(scanf("%d",&n)!=EOF) {    
        if(n<=0)  
            break;        
        for(i=1;i<=n;i++)  
            scanf("%d",&Rp[i]);  
        subRp[0]=0;//刚开始为0,那么做下一件事情的人品值就是0-Rp[i]  
        addRp[0]=0;//初始化为0,做下一件事情的人品值是0+Rp[i];                 
        for(i=1;i<=n;i++)    
        {  
            //subRp为做与不做第i件事的结果的最大值
            //这里要注意下,因为subRp存放的是:做下一个事件是减人品的那些值。
            //比如i%2=0,那么subRp[1]是上次的结果。这个时候可以选择不做,那么subRp[0]=subRp[1],
            //假如做了,那么下次事件就是涨人品的,是要存在addRp[0]中的,而addRp[1]做该事件,
            //下次就是减人品的。所以做该事件的时候,subRp[0]=addRp[1]+Rp[i];最后比较subRp[1]与
            //addRp[1]+Rp[i],其中较大的值就是subRp[0]的值。addRp中的值也是这么求的。
            if(subRp[(i-1)%2]<addRp[(i-1)%2]+Rp[i])                  
                subRp[i%2]=addRp[(i-1)%2]+Rp[i];     
             else      
                 subRp[i%2]=subRp[(i-1)%2]; 
                        
             if(addRp[(i-1)%2]<subRp[(i-1)%2]-Rp[i])      
                 addRp[i%2]=subRp[(i-1)%2]-Rp[i];     
             else      
                 addRp[i%2]=addRp[(i-1)%2];    
         }       
         if(addRp[n%2]>subRp[n%2])  
             subRp[n%2]=addRp[n%2];   
         printf("%lld\n",subRp[n%2]);
    }
}

2010-07-28 15:14
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
把内存优化一下,可以得到下面的结果
程序代码:
#include <stdio.h>
int Rp;
main(){  
    int n;
    int i;   
    long long  subRp[2],addRp[2];
    while(scanf("%d",&n)!=EOF) {    
        if(n<=0)  
            break; 
        subRp[0]=0;
        addRp[0]=0;       
        for(i=1;i<=n;i++)
        {  
            scanf("%d",&Rp);
            if(subRp[(i-1)%2]<addRp[(i-1)%2]+Rp)                  
                subRp[i%2]=addRp[(i-1)%2]+Rp;     
             else      
                 subRp[i%2]=subRp[(i-1)%2]; 
                        
             if(addRp[(i-1)%2]<subRp[(i-1)%2]-Rp)      
                 addRp[i%2]=subRp[(i-1)%2]-Rp;     
             else      
                 addRp[i%2]=addRp[(i-1)%2];
        }   
         if(addRp[n%2]>subRp[n%2])  
             subRp[n%2]=addRp[n%2];   
         printf("%lld\n",subRp[n%2]);
    }
}

 
2010-07-28 15:20
heartnheart
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:335
专家分:1096
注 册:2009-7-10
收藏
得分:0 
回复 13楼 linjx0123
详细,透彻,明白!
赞一个!
2010-07-28 21:49
快速回复:求AC代码及详细解释(也就是推导思路)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015779 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved