ZOJ 3685 Cube (贪心 + 暴力)

来源:互联网 发布:杭州淘宝培训哪家最好 编辑:程序博客网 时间:2024/05/22 03:22

OJ题目 :click here~~ 

题目分析:S=(-1)Kn*n3+(-1)Kn-1*(n-1)3+...+(-1)K2*23+(-1)K1*13. 确定每项之前的符号,使得 | s | 最小。

由于n的范围是[1  10000] , 可以先贪心,最后暴力矫正。 

LL sum[1<<21];int op[10002];int main(){    int n , k, i , j;    for(i = 0;i < (1<<20);i++){        for(j = 0;j < 20;j++)            if(i & (1<<j)) sum[i] += (j + 1)*(j + 1)*(j + 1);    }    while(cin >> n){        LL a = 0 , ans = (LL)1<<50;        LL all = 0;        k = min(20 , n);        for(i = n;i > k;i--){            if(a < 0){                a += (LL)i * (LL)i * (LL)i ;                op[i] = 0 ;            }            else{                a -= (LL)i * (LL)i * (LL)i ;                op[i] = -1 ;            }        }        for(i = 1;i <= k;i++) all += (LL)i * (LL)i * (LL)i;        for(i = 0;i < (1<<k);i++){            if(abs(a + 2 * sum[i] - all) < ans){                ans = abs(a + 2 * sum[i] - all);                j = i;            }        }        i = j;        for(j = 0;j < k;j++){            if(i & (1 << j)) op[j + 1] = 0;            else op[j + 1] = -1;        }        for(i = n;i >= 1;i--)            op[i] == 0 ? printf("+") : printf("-");        puts("");    }    return 0;}


2 0
原创粉丝点击