sincerit 勇气获得机(艺术艺术)

链接:https://ac.nowcoder.com/acm/contest/315/B
来源:牛客网

题目描述
妞妞听说Nowcoder Girl女生编程挑战赛要开始了, 但是她没有足够的勇气报名参加, 牛牛为了帮助妞妞,给她准备一台勇气获得机。初始的时候妞妞的勇气值是0, 勇气获得机有两个按钮:

1、N按钮: 如果当期拥有的勇气值为x, 按下之后勇气值将变为2*x+1,

2、G按钮: 如果当前拥有的勇气值为x, 按下之后勇气值将变为2*x+2,

勇气值过高也会膨胀,所以妞妞需要将自己的勇气值恰好变为n, 请你帮助她设计一个勇气获得机的按键方案使妞妞的勇气值恰好变为n。

输入描述:
输入包括一行, 包括一个正整数n(1 <= n <= 10^9), 表示妞妞最后需要的勇气值。
输出描述:
输出一行字符串, 每个字符表示该次妞妞选择按动的按钮,'N’表示该次按动N按钮,'G’表示该次按动G按钮。
示例1
输入
复制
20
输出
复制
NGNG

一开始用的是深搜发现,提交完还是错的不知道为什么错误代码也贴出来

#include <stdio.h>
#include <cstring>
long long n, flag;
char ans[10000], k;
void DFS(long long sum, char p, int k) {
  if (flag) return;
  ans[k++] = p;
  if (sum >= n) {
    if (sum == n) {
      for (int i = 0; i < k; i++) printf("%c", ans[i]);
      flag = 1;
    }
    return;
  }
  DFS(2*sum+1, 'N', k);
  DFS(2*sum+2, 'G', k);
}
int main() {
  scanf("%lld", &n);
  flag = k = 0;
  DFS(1, 'N', 0);
  if (flag == 0) {
    k = 0;
    DFS(2, 'G', 0);
  }
  return 0;
}

艺术时间,观察如果n为奇数那肯定至少有一个N,因为N才会出现奇数,如果n是偶数那肯定是G,因为G是加了一个2,会不会是两个N呢,肯定不会的,因为第一个N之后是奇数,第二个N之后还是奇数

倒着推, 如果现在一个是偶数,那么前一次到现在只能选G, 然后得到上一次的结果倒着推
如果现在是一个奇数,那么上一次到现在只能选N,再得到上一次的结果倒着推

#include <stdio.h>
#include <cstring>
int main() {
  long long n;
  int cnt = 0;
  scanf("%lld", &n);
  char ans[1000];
  while (n) {
    if (n % 2 == 0) {
      ans[cnt++] = 'G';
      n /= 2;
      n--;
    } else {
      ans[cnt++] = 'N';
      n /= 2;
    }
  }
  for (int i = cnt-1; i >= 0; i--) printf("%c", ans[i]);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值