链接: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;
}