URAL_1222 Chernobyl’ Eagles

标签: URAL

题目链接

题目大意

一只鹰的智商精确等于它的头的数目, 而一群鹰的智商等于各只鹰的智商的乘积。问给定一群鹰的总头数n,求这群赢的智商的最大值。

思路

求余,再乘上 n剩下的部分 分割成3的幂积(指数和底数都能相对较大)
然后如果余数小于等于1的话,就再加上三,当第一个基数大一点(这样和三比较接近)。

代码

python 比较简洁,但是效率一般

# Copyright (c) 2015 HuangJunjie@SYSU(SNO:13331087). All Rights Reserved.
# original from http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27826
import sys

num = sys.stdin.readline()
n = int(num)
result = n % 3
n -= result

if (result <= 1 and n > 1):
  result += 3
  n -= 3

while n:
  result *= 3
  n -= 3

print result

c++ 使用高精度,效率能高一点

// Copyright (c) 2015 HuangJunjie@SYSU(SNO:13331087). All Rights Reserved.
// original from http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27826
#include <cstdio>

#define MAX_SIZE 3000
#define MOD 100000000

int answer[MAX_SIZE + 1] = { 0 };
int highest = 0;      // the index to find the most significant element

void multiply3() {
  int carry = 0;
  for (int i = 0; i <= highest; i++) {
    int remain = (answer[i] * 3 + carry) % MOD;
    carry = (answer[i] * 3 + carry) / MOD;
    answer[i] = remain;
    if (i == highest && carry) highest++;
  }
}

void output() {
  printf("%d", answer[highest]);
  for (int i = highest - 1; i >= 0; i--) printf("%08d", answer[i]);
  printf("\n");
}

int main() {
  int N;
  scanf("%d", &N);
  answer[0] = N % 3;
  N -= answer[0];

  if (answer[0] <= 1 && N >= 3) {
    answer[0] += 3;
    N -= 3;
  }

  while (N) {
    multiply3();
    N -= 3;
  }

  output();
  return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容