文章目录
一、生命貮号长智力
期中考试快到了,面对一大堆课程要复习,总是让人焦头烂
额,有什么办法可以让你瞬间获取超能力呢? Du 老师最近发明了一种
补脑神药:生命 2 号口服液,吃了它可以让你脑袋以每秒 5000 转的速
度转动,记忆存储功能超常表现,理解能力线性增长。 现在摆在你面
前有很多生命 2 号排成一排,每个生命 2 号的 power 值不一样,现在你
要取一些生命 2 号神药服用,但是要求不能取任意两个相邻的生命 2 号,
请问怎么才能得到最多的能量值。在下图所示的 6 个小瓶中,我们取第
1 个、第 3 个和第 6 个瓶子时可以得到 1+4+8=13 的能量值。
#include <stdio.h>
int maxEnergy(int energy[], int n) {
int dp[n]; // 存储最大能量值的数组
dp[0] = energy[0]; // 初始化第一个瓶子的最大能量值
// 递推计算最大能量值
for (int i = 1; i < n; i++) {
// 当前瓶子选中时的最大能量值
int include = energy[i];
// 前一个瓶子未选中时的最大能量值
int exclude = dp[i - 1];
// 当前瓶子与前一个瓶子相邻时,选择能量值较大的瓶子
dp[i] = (include > exclude + energy[i - 1]) ? include : exclude + energy[i -
1];
}
return dp[n - 1]; // 返回最后一个瓶子的最大能量值
}
int main() {
int energy[] = {1, 3, 4, 1, 8, 2}; // 每个瓶子的能量值
int n = sizeof(energy) / sizeof(energy[0]); // 瓶子的数量
int maxEnergyValue = maxEnergy(energy, n);
printf("最大能量值为:%d\n", maxEnergyValue);
return 0;
}
二、破译密码靠你啦!
最近手机频频被盗,引起了学校的高度重视。Du
老师给的建议是直接扔宿舍,这样既可以保证手机安全又可以安心上课
心无旁骛。但是很显然,这不太现实。学校发现,偷手机的人是团伙作
案,他们之间通过加密的英文信息进行通讯,这些加密的信息完全看不
懂,但是很幸运的是解密规则被你无意中发现。具体解密方法是这样:
(1) 每一个#替换为一个空格
(2) 把数字 1 换成 A,2 换成 B,3 换成 C… 26 换成 Z
(3)连字符(短横线)不必理会,仅仅是分割每一个字母
比如小偷的行动地点是学生食堂,那么明文和对应的密文如下所示。
明文:XUE SHENG SHI TANG
密文:26-21-5#19-8-5-14-7#19-8-9#29-1-14-7
现在学校截获了很多密文,要求计算机系的你帮助学校破译,如果破译
成功,将会记大功一件,并直接保送。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void decrypt(char* ciphertext) {
int len = strlen(ciphertext);
char* plaintext = (char*)malloc((len + 1) * sizeof(char)); // 动态分配内存存储解
密后的明文
for (int i = 0; i < len; i++) {
if (ciphertext[i] == '#') {
plaintext[i] = ' ';
} else if (ciphertext[i] == '-') {
continue; // 跳过连字符
} else {
int shift = ciphertext[i] - '0';
char decryptedChar = 'A' + shift - 1;
plaintext[i] = decryptedChar;
}
}
plaintext[len] = '\0'; // 添加字符串结束符
printf("解密结果:%s\n", plaintext);
free(plaintext); // 释放动态分配的内存
}
int main() {
char ciphertext[1000];
printf("请输入密文:");
fgets(ciphertext, sizeof(ciphertext), stdin);
// 移除换行符
ciphertext[strcspn(ciphertext, "\n")] = '\0';
decrypt(ciphertext);
return 0;
}