{"title":"题目描述:\n上了半天的物理数学课,大家的脑子有点转不动了,下午的课表似乎看透了同学们的心思,第一节就安排了体育课,CZ中学的课表真是太有爱了,赞一个!午间休息后,文体委员小S喊大家到教室外的走廊上排队,队形整好后小S带着大家走到了大操场上,体育老师早就在那等着了,他先安排同学们做了五分钟的准备活动,接下来让大家玩一个有趣的游戏,在这个游戏里,全班同学先散开站在操场上,同学们轮流玩这个游戏,从1号同学开始,然后是2号3号等等(只要这个同学仍然参与这个游戏)。每次轮到玩的同学,就选择一个目前离他最近的同学,走过去拍他一下,然后回到原来的位置,那个被拍到的同学就被排除在游戏之外了,必须立刻离开操场。当操场上只剩下一个同学时,游戏即告结束,最后站在操场上的那个同学就是嬴家。\nR老师正和隔壁班的F主任津津有味地在场边看着同学们做游戏,为了添加一点乐趣,R老师就和F主任打赌哪个同学会嬴?所以他想事先知道谁是嬴家。R老师希望你写一个程序,读入同学们相互之间的距离,模拟出哪个同学最终会获胜。\n输入: 输入数据第一行为一个正整数N,表示在操场上玩游戏的人数,其中1WNS1000,接下来共有N行数据,每行有N个用空格隔开的整数,其中第i行\n 第j列的数据表示操场上编号为i的同学与编号为j的同学之间的距离。输入数据保证第i行第i列(主对角线上的位置)的数据均为0,其余数据均为正整\n 数,且第i行第J列的数据一定等于第J行第i列的数据,这意味着同学甲到同学乙的距离等于同学乙到同学甲的距离;操场上任意两对同学之间的距离均\n 不相同,也就是说上三角部分的正整数互不相同。\n输出: 输出数据仅有一行包含一个正整数表示获胜的同学的编号。\n样例1:输入 \n4\n0 1 6 3\n1 0 4 5\n6 4 0 2\n3 5 2 0\n样例1:输出\n1\n用C++,尽量降低时间复杂度,确保答案正确内容:思路:\n1. 首先读入操场上玩游戏的人数N以及每个同学之间的距离矩阵。\n2. 创建一个长度为N的数组visited,用来记录每个同学是否被排除出游戏。\n3. 创建一个变量count,用来记录剩余未被排除的同学数量。\n4. 当count大于1时,进行以下循环:\n - 创建一个变量minDistance,初始化为一个较大的值,用来记录当前轮到的同学距离最近的同学的距离。\n - 创建一个变量next,用来记录当前轮到的同学选择的下一个要拍的同学的编号。\n - 遍历每个同学,如果该同学未被排除出游戏,找到距离该同学最近的未被排除的同学,更新minDistance和next。\n - 将被拍到的同学标记为已访问(visited[next]设为1),count减1。\n5. 输出最后剩下的未被排除的同学的编号。\n\n代码实现如下:\n\n#include \n#include \n#include \n\nusing namespace std;\n\nint main() {\n int N;\n cin >> N;\n \n vector<vector> distance(N, vector(N));\n for (int i = 0; i < N; i++) {\n for (int j = 0; j < N; j++) {\n cin >> distance[i][j];\n }\n }\n \n vector visited(N, 0);\n int count = N;\n \n while (count > 1) {\n int minDistance = numeric_limits::max();\n int next;\n \n for (int i = 0; i < N; i++) {\n if (visited[i] == 0) {\n for (int j = 0; j < N; j++) {\n if (visited[j] == 0 && distance[i][j] < minDistance) {\n minDistance = distance[i][j];\n next = j;\n }\n }\n }\n }\n \n visited[next] = 1;\n count--;\n }\n \n for (int i = 0; i < N; i++) {\n if (visited[i] == 0) {\n cout << i+1 << endl;\n break;\n }\n }\n \n return 0;\n}\n


原文地址: http://www.cveoy.top/t/topic/p56A 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录