2月13日打卡

一、最大效益

题目:明明的爸爸开了一家小公司,公司里有5名职员。今天,公司接待了5位客户。明明的爸爸知道,和任何一位客户谈判并签下合同都要花一整天的时间,而他又希望在一天之内,和这5位客户都签好合同。因此,明明的爸爸要求公司里的5名职员分别与1位客户谈判。

明明的爸爸也知道,这5名职员和5位客户的性格各不相同。因此,不同的职员与不同的客户谈判,会给公司带来不同的经济效益。他现在要做出一个决策,让5名职员分别与哪位客户谈判,才能让公司今天的总经济效益最大。

明明的爸爸首先做了一张5行5列的效益表,如下所示:

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

在这张效益表中,每行代表一名公司职员,每列代表一个客户,每行中的5个数字就表示了当该行所代表的公司职员和每位客户谈判时所能产生的效益。明明的爸爸就要通过这张效益表来决定哪位职员与哪位顾客谈判,然后能够使公司的效益最大。就拿上面这张表来看,由于无论哪位职员与哪位客户谈判,所产生的效益都是1,因此最大的效益就是5。这是最简单的一种情况,但是当效益表里的数字变得复杂,就很难进行选择,到底哪种组合方式才是最优的。因此明明的爸爸求助于你,帮助他解决这个问题。

明明的爸爸的问题可以归结为:给你一张5行5列的效益表,表中的数字均为大于等于0的整数,要求在这张表中选出5个数字,使这5个数字的和最大。(注:这5个数字分别来自表中的不同行不同列,即同一行只能选择一个数字,同一列也只能选择一个数字。)

输入说明:你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据。每组测试数据占5行;每行包含5个正整数;第i行的第j个正整数Aij代表第i名职员与第j位客户谈判能为公司带来的经济效益(0≤Aij≤100, 1≤i,j≤5)。每组测试数据与其后一组测试数据之间没有任何空行;第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明:对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数s,即这一天中公司的最大可能总经济效益。例如:当测试数据中的所有Aij(1≤i,j≤5)均为1时,运算结果s应为5。输出时,每组运算结果s单独占一行,其行首和行尾都没有任何空格或其他任何字符;每组运算结果与其后一组运算结果之间没有任何空行或其他任何字符,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行或其他任何字符。

个人总结:

这道题本质上是一个典型的"分配问题",也可以理解为在一个 5×5 的矩阵中,从每一行选择一个元素,且所选元素的列互不相同,使得总和最大。换句话说,就是在所有行列一一对应的排列方式中寻找最大收益,这实际上等价于对 5 个客户进行全排列,然后计算对应收益的最大值。

代码采用的是深度优先搜索(DFS)结合回溯算法来穷举所有可能的分配方案。程序用一个二维数组 a[5][5] 存储效益表,用一维数组 used[5] 记录某一列(客户)是否已经被选过。dfs 函数的含义是:当前正在给第 row 个职员分配客户,当前已获得的收益为 sum。当 row 等于 5 时,说明 5 名职员都已经分配完成,此时更新最大收益 maxSum。否则,在当前行中依次枚举 5 个客户,如果该客户尚未被使用,则标记该列为已使用,递归处理下一行,并在递归返回后恢复现场(回溯),将该列重新标记为未使用,从而继续尝试其他可能。

代码:

#include <stdio.h>

int a[5][5];

int used[5];

int maxSum;

void dfs(int row, int sum) {

if (row == 5) {

if (sum > maxSum) {

maxSum = sum;

}

return;

}

for (int col = 0; col < 5; col++) {

if (!used[col]) {

used[col] = 1;

dfs(row + 1, sum + a[row][col]);

used[col] = 0;

}

}

}

int main() {

while (1) {

// 尝试读取第一行

if (scanf_s("%d", &a[0][0]) != 1)

break;

// 读完整个 5×5

for (int j = 1; j < 5; j++)

scanf_s("%d", &a[0][j]);

for (int i = 1; i < 5; i++)

for (int j = 0; j < 5; j++)

scanf_s("%d", &a[i][j]);

// 初始化

for (int i = 0; i < 5; i++)

used[i] = 0;

maxSum = 0;

// 搜索

dfs(0, 0);

// 输出结果

printf("%d\n", maxSum);

}

return 0;

}

二、螺旋方阵

题目:

明明在上学的时候,参加数学兴趣班。在班上,老师介绍了一种非常有趣的方阵,称之为螺旋方阵。该方阵一共由n×n个正整数构成(我们称之为n阶螺旋方阵),即共有n行n列。

方阵中的数字从1开始递增,数字的排序规则是从左上角出发由1开始排序,并按顺时针方向旋进,即先排最外面的一圈,然后排里面的一圈,以此类推,直到排到最后一个数为止。

例如一个4阶的螺旋方阵,一共有4×4=16个正整数构成,数字从1递增到16,最后排出来的方阵如下:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

明明回家后想自己动手构造这样的螺旋方阵。他从n=1开始构造,但是他发现当n越来越大时,螺旋方阵的复杂性就越高,然后构造出来的方阵就越容易出错。为了降低构造方阵的出错率,提高构造速度,明明就求助于你,请你帮他写一个程序,来构造螺旋方阵。 明明的问题可以归结为:给你一个正整数n,请你按题目描述中所述的方法,构造出n阶的螺旋方阵。

输入说明:你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个正整数n(1≤n≤10),即所要构造的螺旋方阵的阶数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明:对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个n阶的螺旋方阵,方阵中的数字用一个空格隔开,具体形式请参考输出样例。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果之后没有空行。 注:通常,显示屏为标准输出设备。

个人总结:

这道题实现的是典型的螺旋矩阵构造算法,本质是一种按"层"进行模拟填充的过程。程序并不是通过复杂的数学规律推导,而是采用边界控制的方法,一圈一圈地向内填数,直到填满整个 n×n 矩阵。

具体算法思想是使用四个变量 top、bottom、left、right 分别表示当前尚未填充区域的上边界、下边界、左边界和右边界。初始时 top=0,bottom=n-1,left=0,right=n-1,表示整个矩阵都未填充。然后从数字 1 开始递增,用一个循环在 num ≤ n*n 的条件下不断填入矩阵。每一轮循环按顺时针方向完成四个步骤:首先从左到右填充当前最上面一行(top 行),填完后上边界下移;接着从上到下填充当前最右一列(right 列),填完后右边界左移;然后从右到左填充当前最下面一行(bottom 行),填完后下边界上移;最后从下到上填充当前最左一列(left 列),填完后左边界右移。这样完成一圈外层填充后,边界向内收缩,继续填下一层,直到所有数字填完为止。

代码:

#include <stdio.h>

int main() {

int n;

while (scanf_s("%d", &n) == 1)

{

int a[15][15];

int top = 0, bottom = n - 1;

int left = 0, right = n - 1;

int num = 1;

while (num <= n*n)

{

for (int j = left; j <= right && num <= n * n; j++) {

a[top][j] = num++;

}

top++;

for (int i = top; i <= bottom && num <= n * n; i++) {

a[i][right] = num++;

}

right--;

for (int j = right; j >= left && num <= n * n; j--) {

a[bottom][j] = num++;

}

bottom--;

for (int i = bottom; i >= top && num <= n * n; i--) {

a[i][left] = num++;

}

left++;

}

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

if (j) printf(" ");

printf("%d", a[i][j]);

}

printf("\n");

}

}

return 0;

}

三、方块转换

题目:

一块N x N(1=<N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。

写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

#1:转90度:图案按顺时针转90度。

#2:转180度:图案按顺时针转180度。

#3:转270度:图案按顺时针转270度。

#4:反射:图案在水平方向翻转(形成原图案的镜像)。

#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。

#6:不改变:原图案不改变。

#7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

比如:

转换前:

@-@


@@-

转换后:

@-@

@--

--@

这种转换采取#1(按顺时针转90度)即可。

注意:图案中的字符"@"和"-"在转90度后,还是"@"和"-"。不要认为"-"转90度后变成"|"。

输入说明:

第一行: 单独的一个整数N。

第二行到第N+1行: N行,每行N个字符(不是'@'就是'-');这是转换前的正方形。

第N+2行到第2*N+1行: N行,每行N个字符(不是'@'就是'-');这是转换后的正方形。

输出说明:单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

个人总结:

这道题本质上是一个矩阵变换与模式匹配问题,核心思想是通过枚举所有可能的合法变换方式,将原图案逐一转换后与目标图案进行比较,从而找出编号最小的可行转换方式。由于 N≤10,规模很小,因此可以采用直接模拟加逐一判断的方法完成。

程序的整体思路是"构造 + 比较"。首先读入原图案 a 和目标图案 b,然后依次按照题目给出的七种情况进行检测。所谓旋转 90°,本质是矩阵坐标变换,即原矩阵中位置 (i, j) 的元素在旋转后应出现在 (j, n-1-i) 位置,这是一种典型的顺时针旋转映射。180° 和 270° 旋转并不单独写公式,而是通过对 90° 旋转结果再次旋转来得到,这样可以复用函数,减少错误。反射操作则是左右翻转,本质是列坐标变换 (i, j) → (i, n-1-j)。组合变换是先做反射,再对反射结果进行 90°、180° 或 270° 旋转,并逐一与目标图案比较。最后再检查是否原图案与目标图案完全一致,如果都不满足则判为无效转换。

代码:

#include <stdio.h>

int n;

char a[10][11], b[10][11];

char r1[10][11], r2[10][11], r3[10][11], t[10][11];

int same(char x[10][11], char y[10][11]) {

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

if (x[i][j] != y[i][j])

return 0;

return 1;

}

// 顺时针旋转 90°

void rotate90(char src[10][11], char dst[10][11]) {

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

dst[j][n - 1 - i] = src[i][j];

}

// #4 反射:左右翻转(沿竖直轴)

void reflect(char src[10][11], char dst[10][11]) {

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

dst[i][n - 1 - j] = src[i][j];

}

int main() {

scanf("%d", &n);

for (int i = 0; i < n; i++)

scanf("%s", a[i]);

for (int i = 0; i < n; i++)

scanf("%s", b[i]);

// #1 90°

rotate90(a, r1);

if (same(r1, b)) { printf("1\n"); return 0; }

// #2 180°

rotate90(r1, r2);

if (same(r2, b)) { printf("2\n"); return 0; }

// #3 270°

rotate90(r2, r3);

if (same(r3, b)) { printf("3\n"); return 0; }

// #4 反射(左右)

reflect(a, t);

if (same(t, b)) { printf("4\n"); return 0; }

// #5 反射 + 旋转

rotate90(t, r1);

if (same(r1, b)) { printf("5\n"); return 0; }

rotate90(r1, r2);

if (same(r2, b)) { printf("5\n"); return 0; }

rotate90(r2, r3);

if (same(r3, b)) { printf("5\n"); return 0; }

// #6 不改变

if (same(a, b)) { printf("6\n"); return 0; }

// #7 无效

printf("7\n");

return 0;

}

四、英语翻译

1.Supply chain management is a process used by companies toensure that their supply chain is efficient and cost-effective.Supply chain management can be aided by an loT system. Theidea is to manage a whole network of related businesses orpartners involved in product manufacturing, delivery, andservices as required by end customers. At any given time, market forces could demand changes from suppliers, logistics providers,locations and customers, and any number of specializedparticipants in a supply chain. This variability has significanteffects on the supply chain infrastructure, ranging from thefoundation layers of establishing the electronic communicationbetween the trading partners to the more complex configurationof the processes and the arrangement of workflows that areessential to a fast production process.

供应链管理是企业用于确保供应链高效且具有成本效益的过程。物联网系统可以为供应链管理提供支持。其核心思想是对涉及产品制造、配送和服务的整个相关企业或合作伙伴网络进行统一管理,以满足终端客户的需求。在任何特定时刻,市场力量都可能要求供应商、物流提供商、地点和客户以及供应链中各种专业参与者做出调整。这种变化性会对供应链基础设施产生重大影响,从建立贸易伙伴之间电子通信的基础层面,到更复杂的流程配置和工作流安排,而这些都是实现快速生产过程所必需的。

2.A critical loT application is promotion of a smart power grid.Various power companies across the United States have or are inthe process of upgrading their power management anddistribution systems. Various sensors at individual homes (smartthermostats) can collect information that is sent via a networkto main stations (perhaps even local "hubs") that can applycomplex power management and send control signals back tothe grid to save energy.The smart grid is made possible by applying sensing, measurement, and controldevices to electricity production, transmission, distribution,and consumption.

一个关键的物联网应用是推动智能电网的发展。美国各地的电力公司已经或正在升级其电力管理与配电系统。家庭中的各种传感器(如智能恒温器)可以采集信息,并通过网络将数据发送到主控站(甚至可能是本地"枢纽"),主控站能够进行复杂的电力管理,并向电网发送控制信号以节约能源。智能电网的实现依赖于在电力的生产、传输、分配和消费过程中应用感知、测量和控制设备。

3.The loT has been suggested in construction of smart buildings inresidential, commercial, industrial, and government settings. Asmart building can be a shopping mall or a home, a hospital ora high-rise office tower. Smart buildings need monitoring andregulation of heating, air conditioning,lighting, andenvironmental changes. They can oversee building security, firebuildingsuppression,and elevatoroperations.Smarttechnologies focus on bringing more detailed monitoring andsensing "awareness" to buildings.

物联网还被应用于建设智能建筑,包括住宅、商业、工业和政府建筑。智能建筑可以是购物中心、住宅、医院或高层办公楼。智能建筑需要对供暖、空调、照明以及环境变化进行监测与调节,还可以管理建筑安防、消防系统以及电梯运行。智能技术的核心在于为建筑带来更加精细的监测能力和感知"意识"。

五、单词打卡

相关推荐
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #153:寻找旋转排序数组中的最小值(暴力搜索、二分查找等五种实现方案详细解析)
算法·leetcode·二分查找·旋转数组·最小值搜索
春日见2 小时前
commit与fetch
linux·人工智能·算法·机器学习·自动驾驶
俩娃妈教编程2 小时前
洛谷选题:P1888 三角函数
c++·算法
TracyCoder1232 小时前
LeetCode Hot100(56/100)——131. 分割回文串
算法·leetcode
_OP_CHEN2 小时前
【算法提高篇】(一)线段树之入门篇:从原理到实战,搞定区间操作难题
数据结构·算法·蓝桥杯·线段树·c/c++·区间查询·acm、icpc
IvanCodes2 小时前
九、C语言动态内存管理
c语言·开发语言·算法
pp起床2 小时前
贪心算法 | part05
算法·贪心算法
MediaTea2 小时前
Python:迭代器的应用场景
开发语言·python·算法
uesowys2 小时前
Apache Spark算法开发指导-Random forest regression
算法·spark