hdu 1034 (preprocess optimization, property of division to avoid if, decreasing order process)

IMO, version 1 better than version 2, version 2 better than version 3.
make some preprocess to make you code simple and efficient. Here divide the input by 2, so you don’t have to do dividsion on each loop.
version 1 is best
thanks to
http://www.cnblogs.com/kuangbin/archive/2012/06/03/2532690.html

#include <cstdio>
#include <algorithm>

#define MAXSIZE 10000

int candies[MAXSIZE];

int main() {
    //freopen("input.txt","r",stdin);
    int n, cnt_whistle, i, tmp;
    while(scanf("%d",&n)!=EOF && n>0) {
        for(i=0;i<n;++i) { scanf("%d",&tmp); candies[i]=tmp>>1; }
        for(--n, cnt_whistle=1;;++cnt_whistle) {
            tmp=candies[n];
            for(i=n;i>0;--i) {
                candies[i]=(candies[i-1]+candies[i]+1)>>1;
            }
            candies[0]=(tmp+candies[0]+1)>>1;
            for(i=1;i<=n && candies[i-1]==candies[i];++i) ;
            if(i-n==1) break;
        }
        printf("%d %d\n",cnt_whistle,candies[0]<<1);
    }
    return 0;
}

use division’s floor property (5/2=2) to avoid if sentences. in version 2 here

t2=candies[i];
candies[i]=(t1+t2+1)>>1;
t1=t2;

if don’t divide input by 2, the code will be

t2=candies[i]>>1;
candies[i]=t1+t2;
if(candies[i]%2) ++candies[i];
t1=t2;

how to avoid process the border conditions? version 2 better than version 3 on this aspect. version 1 accomplish this, thanks to
http://www.acmerblog.com/hdu-1034-candy-sharing-game-1285.html

version 2

#include <cstdio>
#include <algorithm>

#define MAXSIZE 10000

int candies[MAXSIZE];

int main() {
    //freopen("input.txt","r",stdin);
    int n, cnt_whistle, i, t1,t2;
    while(scanf("%d",&n)!=EOF && n>0) {
        for(i=0;i<n;++i) { scanf("%d",&t1); candies[i]=t1>>1; }
        for(--n, cnt_whistle=1;;++cnt_whistle) {
            t1=candies[n];
            for(i=0;i<=n;++i) {
                t2=candies[i];
                candies[i]=(t1+candies[i]+1)>>1;
                t1=t2;
            }
            for(i=1;i<=n && candies[i-1]==candies[i];++i) ;
            if(i-n==1) break;
        }
        printf("%d %d\n",cnt_whistle,candies[0]<<1);
    }
    return 0;
}

version 3

#include <cstdio>
#include <algorithm>

#define MAXSIZE 10000

int candies[MAXSIZE];
int cand_temp[MAXSIZE];

int main() {
    //freopen("input.txt","r",stdin);
    int n, cnt_whistle, i, *p,*q;
    while(scanf("%d",&n)!=EOF && n>0) {
        for(i=0;i<n;++i) { scanf("%d",&t1); candies[i]=t1>>1; }
        p=candies, q=cand_temp;
        for(--n, cnt_whistle=1;;++cnt_whistle) {
            for(i=1;i<=n;++i) {
                q[i]=(p[i-1]+p[i]+1)>>1;
            }
            q[0]=(p[n]+p[0]+1)>>1;
            std::swap(p,q);
            for(i=1;i<=n && p[i-1]==p[i];++i) ;
            if(i-n==1) break;
        }
        printf("%d %d\n",cnt_whistle,p[0]<<1);
    }
    return 0;
}

p.s. when you use swap tricks (as in version 3), be careful with the check points, e.g. the initialization part, the conclusion part, especially the items are used by multiple times.
here is mistake I made, 1st, initilization error
position of

cnt_whistle=1;

mistakely put it to declaration part rather than just befor the for loop;
2nd, the third parameter of printf
mistakely wirite

printf("%d %d\n",cnt_whistle,candies[0]<<1);

which should be

printf("%d %d\n",cnt_whistle,p[0]<<1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值