东华复试day5
最简单的响应是反射动作(reflex action),即对输入数据做出的预设反应。如果我们希望智能体去追求某个目标,比如赢得一盘棋或在拥挤的通道(passageway)中灵活移动(maneuvering),就需要另一层次的响应。这种目标导向的行为要求智能体的响应(或一系列响应),是刻意制定行动计划或从当前选项中选择最佳行动的结果。人工智能领域的大部分研究,都可以放在构建智能体(agents)的背景
OJ26
个人总结:1. sum初始值改为1,阶乘的乘法初始值必须是1
2. 每次乘法后立即去掉末尾的0,避免数值过大
3. 只保留最后几位有效数
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
long long result = 1; // 用long long减少溢出风险
for(int i = 1; i <= n; i++){
result *= i;
while(result % 10 == 0){
result /= 10;
}
result = result % 10000;
}
printf("%d\n", result % 10);
return 0;
}
字(比如最后4位),进一步防止溢出
OJ27
个人总结:1. 结构体定义:字符数组存菜名,末尾加分号
2. 四舍五入到角(保留1位小数) 方法:先×10,四舍五入取整,再÷10
#include<stdio.h>
struct Dish {
char kind[20]; // 菜名是字符串,用字符数组存储
double num; // 数量
double price; // 单价
}; // 结构体末尾必须加分号
int main() {
int group_num;
scanf("%d", &group_num);
for (int i = 0; i < group_num; i++) {
int dish_num;
scanf("%d", &dish_num);
double total = 0.0;
struct Dish dish;
for (int j = 0; j < dish_num; j++) {
scanf("%s %lf %lf", dish.kind, &dish.num, &dish.price);
total += dish.num * dish.price;
}
total = (double)((int)(total * 10 + 0.5)) / 10;
printf("%.1f\n", total);
}
return 0;
}
OJ28
个人总结:本题输出格式较为复杂
#include <stdio.h>
#include <string.h>
int main() {
// 定义水果的代码、名称、单价对应关系
struct Fruit {
char code; // 水果代码
char name[20]; // 水果名称
double price; // 单价(元/公斤)
} fruits[] = {
{'a', "apple", 1.5},
{'o', "orange", 1.4},
{'b', "banana", 1.48},
{'p', "pineapple", 1.08}
};
int fruit_count = sizeof(fruits) / sizeof(fruits[0]); // 水果种类数
int m; // 每组的货品数量
int group_index = 0; // 记录当前是第几组数据,用于处理空行
// 循环读取每组数据(直到输入结束)
while (scanf("%d", &m) == 1) {
// 不是第一组的话,先输出一个空行(满足组间空行要求)
if (group_index > 0) {
printf("\n");
}
group_index++;
double total_sum = 0.0; // 本组所有货品的总价总和
char name_line[100] = ""; // 存储第一行(水果名)的内容
char price_line[100] = ""; // 存储第二行(价格)的内容
char weight_line[100] = ""; // 存储第三行(重量)的内容
// 初始化第一行开头的7个空格
strcat(name_line, " ");
// 初始化第二行的price和空格
strcat(price_line, "price ");
// 初始化第三行的weight和空格
strcat(weight_line, "weight ");
// 处理本组的m个货品
for (int i = 0; i < m; i++) {
char d;
double g;
scanf(" %c %lf", &d, &g); // 读取货品代码和重量(%c前加空格跳过换行/空格)
// 匹配对应的水果信息
char fruit_name[20] = "";
double unit_price = 0.0;
for (int j = 0; j < fruit_count; j++) {
if (fruits[j].code == d) {
strcpy(fruit_name, fruits[j].name);
unit_price = fruits[j].price;
break;
}
}
// 计算单个货品的总价
double single_sum = unit_price * g;
total_sum += single_sum;
// 拼接第一行(水果名):apple后加2个空格,其他加1个空格
strcat(name_line, fruit_name);
if (strcmp(fruit_name, "apple") == 0) {
strcat(name_line, " ");
} else {
strcat(name_line, " ");
}
// 拼接第二行(价格):按格式输出单价(注意pineapple占10格,其他7格,左对齐,2位小数)
char price_str[20];
if (strcmp(fruit_name, "pineapple") == 0) {
sprintf(price_str, "%-10.2f", unit_price);
} else {
sprintf(price_str, "%-7.2f", unit_price);
}
strcat(price_line, price_str);
// 拼接第三行(重量):格式和价格行一致
char weight_str[20];
if (strcmp(fruit_name, "pineapple") == 0) {
sprintf(weight_str, "%-10.2f", g);
} else {
sprintf(weight_str, "%-7.2f", g);
}
strcat(weight_line, weight_str);
}
// 在第一行末尾添加sum
strcat(name_line, "sum");
// 在第二行末尾添加总总价(占7格,2位小数,左对齐,后加2个空格)
char total_str[20];
sprintf(total_str, "%-7.2f ", total_sum);
strcat(price_line, total_str);
// 第三行无sum对应的重量,无需额外处理
// 输出三行内容
printf("%s\n", name_line);
printf("%s\n", price_line);
printf("%s\n", weight_line);
}
return 0;
}
OJ29
个人总结:本题较简单只需将键盘输入的奇数求乘积
#include <stdio.h>
#include <string.h>
int main() {
int n;
int sum=1;
scanf("%d",&n);
int num;
for(int i=0;i<n;i++){
scanf("%d",&num);
if(num%2!=0){
sum*=num;
}
}
printf("%d",sum);
return 0;
}
OJ30
个人总结本题需要首先要比较年份其次比较月份最后比较日期
#include <stdio.h>
int main() {
int N;
// 循环读取每组测试数据(直到输入结束)
while (scanf("%d", &N) == 1) {
// 初始化最早/最晚日期的变量(用第一个日期初始化)
int min_year, min_month, min_day;
int max_year, max_month, max_day;
// 读取第一个日期,作为初始的最早和最晚日期
scanf("%d %d %d", &min_year, &min_month, &min_day);
max_year = min_year;
max_month = min_month;
max_day = min_day;
// 处理剩余N-1个日期
for (int i = 1; i < N; i++) {
int y, m, d;
scanf("%d %d %d", &y, &m, &d);
// 比较当前日期是否比最晚日期更晚
if (y > max_year) {
max_year = y;
max_month = m;
max_day = d;
} else if (y == max_year) {
if (m > max_month) {
max_month = m;
max_day = d;
} else if (m == max_month && d > max_day) {
max_day = d;
}
}
// 比较当前日期是否比最早日期更早
if (y < min_year) {
min_year = y;
min_month = m;
min_day = d;
} else if (y == min_year) {
if (m < min_month) {
min_month = m;
min_day = d;
} else if (m == min_month && d < min_day) {
min_day = d;
}
}
}
// 输出结果:第一行最晚日期,第二行最早日期
printf("%d %d %d\n", max_year, max_month, max_day);
printf("%d %d %d\n", min_year, min_month, min_day);
}
return 0;
}
它们的环境,以及执行器(actuators)—— 通过这些装置,智能体可以对环境产生影响。传感器的例子包括麦克风、摄像头、测距传感器(range sensors)以及空气或土壤采样设备。执行器的例子包括轮子、腿、翅膀、夹持器(grippers)和语音合成器(speech synthesizers)。
人工智能领域的大部分研究,都可以放在构建智能体(agents)的背景下进行描述 —— 这些智能体能够表现出智能行为,也就是说,其执行器的动作必须是对传感器所接收数据的理性响应。反过来,我们可以通过考虑这些响应的不同层次,来对这类研究进行分类。
最简单的响应是反射动作(reflex action),即对输入数据做出的预设反应。要获得更 “智能” 的行为,就需要更高层次的响应。例如,我们可以让智能体掌握其所处环境的知识,并要求它据此调整自身行为。投掷棒球的过程很大程度上是一种反射动作,但决定如何以及向哪里投球,则需要对当前环境有所了解。如何存储、更新、访问并最终在决策过程中应用这类现实世界知识,至今仍是人工智能领域的一大难题。
如果我们希望智能体去追求某个目标,比如赢得一盘棋或在拥挤的通道(passageway)中灵活移动(maneuvering),就需要另一层次的响应。这种目标导向的行为要求智能体的响应(或一系列响应),是刻意制定行动计划或从当前选项中选择最佳行动的结果。
在某些情况下,智能体的响应会随着学习过程而不断改进。这可能表现为发展程序性知识(procedural knowledge,即学习 “如何做”),或存储陈述性知识(declarative knowledge,即学习 “是什么”)。学习程序性知识通常涉及一个试错(trial-and-error)过程:智能体通过因不当行为受到惩罚、因恰当行为得到奖励,来学习合适的行动。

| 英文术语 | 中文翻译 | 说明 |
|---|---|---|
| sensor | 传感器 | 用于感知环境信息的装置,如麦克风、摄像头 |
| actuator | 执行器 | 用于对环境产生影响的装置,如轮子、夹持器 |
| range sensor | 测距传感器 | 测量距离的传感器 |
| gripper | 夹持器 | 用于抓取物体的机械装置 |
| speech synthesizer | 语音合成器 | 将文本转换为语音的设备 |
| agent | 智能体 | 能够感知环境并采取行动的实体 |
| rational response | 理性响应 | 基于感知数据做出的合理行为 |
| reflex action | 反射动作 | 对输入数据的预设、自动响应 |
| procedural knowledge | 程序性知识 | 关于 “如何做” 的知识,如技能、步骤 |
| declarative knowledge | 陈述性知识 | 关于 “是什么” 的知识,如事实、概念 |
| trial-and-error | 试错 | 通过反复尝试和修正来学习的过程 |
| goal-directed behavior | 目标导向行为 | 为达成特定目标而采取的有计划行动 |
| maneuvering | 灵活移动 | 在复杂环境中调整位置或方向 |
| passageway | 通道 | 供人或物体通过的空间 |

更多推荐


所有评论(0)