VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 417|回复: 4

[已解决]请大神帮解释下这个灵异现象

[复制链接]
27_avatar_middle
最佳答案
0 
在线会员 发表于 2021-3-4 13:37:35 | 显示全部楼层 |阅读模式
PAT中的C++题目,提交时发生灵异事件
int *count = (int*)malloc(sizeof(int)*M);
int *score = (int*)malloc(sizeof(int)*N);
//很神奇的这两行交换位置会增加一个测试点错误

请大神帮解释下这个灵异现象
请大神帮解释下这个灵异现象
其他代码完全一致,请问这两句的顺序会影响到什么因素?
以我浅薄的见识无法理解此现象,
请大神帮分析下
最佳答案
70_avatar_small
2021-3-4 13:45:19
把代码全贴出来给大家看看呗请大神帮解释下这个灵异现象




上一篇:关于mfc 调用 百度 ocr 请问 有例子么
下一篇:截取字符串的问题
27_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-3-4 14:47:37 | 显示全部楼层
  1.        int *count = (int*)malloc(sizeof(int)*M);
  2.     int *score = (int*)malloc(sizeof(int)*N);
复制代码
  1. int z = max(*count, *(count + N));
复制代码

发现一个关键点, max(,)的意思是在两个数之间取较大值,而不是在数组的前N个取最大值,
可能*(count + N)超出内存范围了,        改为
  1. int z=*max_element(count, count + M);
复制代码

之后最后一个测试点也过了,而且调换声明顺序也不会出现灵异现象了,
完结
70_avatar_middle
最佳答案
47 
在线会员 发表于 2021-3-4 13:45:19 | 显示全部楼层    本楼为最佳答案   
bestAnswer
把代码全贴出来给大家看看呗请大神帮解释下这个灵异现象
27_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-3-4 13:55:28 | 显示全部楼层
本帖最后由 whistlingpig 于 2021-3-4 13:56 编辑
tony666 发表于 2021-3-4 13:45
把代码全贴出来给大家看看呗

  1. #include        <iostream>
  2. #include        <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. class question
  6. {
  7. public:
  8.         int maximum;//满分值
  9.         int choices;//选项个数
  10.         int correct;//正确选项个数
  11.         char answer[9];//所有正确选项
  12. };
  13. int main()
  14. {
  15.         int N, M;//N学生人数M多选题的个数
  16.         cin >> N >> M;
  17.         question *TM = (question*)malloc(sizeof(question)*M);
  18.         for (int i = 0; i < M; i++)
  19.         {
  20.                 cin >> TM[i].maximum >> TM[i].choices >> TM[i].correct;
  21.                 char x;
  22.                 int j = 0;
  23.                 do
  24.                 {
  25.                         x = getchar();
  26.                         if (x >= 'a'&&x <= 'z')
  27.                                 TM[i].answer[j++] = x;
  28.                         else if (x == '\n')
  29.                                 TM[i].answer[j++] = '\0';
  30.                 } while (x != '\n');
  31.         }
  32.         int *count = (int*)malloc(sizeof(int)*M);//很神奇的这两行交换位置会增加一个测试点错误
  33.     int *score = (int*)malloc(sizeof(int)*N);
  34.     //int score [1001]={0};
  35.     //int count [101]={0};
  36.         for (int i = 0; i < M; i++)
  37.         {
  38.                 count[i] = 0;
  39.         }
  40.         for (int i = 0; i < N; i++)
  41.         {
  42.                 score[i] = 0;
  43.         }
  44.         for (int i = 0; i < N; i++)
  45.         {
  46.                 for (int j = 0; j < M; j++)
  47.                 {
  48.                         int k = 0;
  49.                         char x, y[9];
  50.                         do
  51.                         {
  52.                                 x = getchar();
  53.                                 if (x >= 'a'&&x <= 'z')
  54.                                         y[k++] = x;
  55.                                 else if (x == ')')
  56.                                         y[k++] = '\0';
  57.                         } while (x != ')');
  58.                         sort(y, y + strlen(y));
  59.                         sort(TM[j].answer, TM[j].answer + strlen(TM[j].answer));
  60.                         if (strcmp(y, TM[j].answer))
  61.                         {
  62.                                 count[j]++;
  63.                         }
  64.                         else
  65.                                 score[i] += TM[j].maximum;
  66.                 }
  67.         }
  68.         for (int i = 0; i < N; i++)
  69.         {
  70.                 cout << score[i] << endl;
  71.         }
  72.         int z = max(*count, *(count + N));
  73.         if (!z)
  74.                 cout << "Too simple" << endl;
  75.         else
  76.         {
  77.                 cout << z;
  78.                 for (int i = 0; i < M; i++)
  79.                 {
  80.                         if (z == count[i])
  81.                                 cout << ' ' << i + 1;
  82.                 }
  83.                 cout << endl;
  84.         }
  85.         return 0;
  86. }
复制代码

//测试点没有全过,本不好意思拿出来献丑
//////////////////////////////////////////////////////
1058 选择题 (20 分)
批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。

输入格式:
输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。

输出格式:
按照输入的顺序给出每个学生的得分,每个分数占一行。注意判题时只有选择全部正确才能得到该题的分数。最后一行输出错得最多的题目的错误次数和编号(题目按照输入的顺序从 1 开始编号)。如果有并列,则按编号递增顺序输出。数字间用空格分隔,行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple。

输入样例:
3 4
3 4 2 a c
2 5 1 b
5 3 2 b c
1 5 4 a b d e
(2 a c) (2 b d) (2 a c) (3 a b e)
(2 a c) (1 b) (2 a b) (4 a b d e)
(2 b d) (1 e) (2 b c) (4 a b c d)
输出样例:
3
6
5
2 2 3 4
70_avatar_middle
最佳答案
47 
在线会员 发表于 2021-3-5 09:42:48 | 显示全部楼层
whistlingpig 发表于 2021-3-4 13:55
//测试点没有全过,本不好意思拿出来献丑
//////////////////////////////////////////////////////
...

不好意思,没看出来啥原因引起的,不过72行这个max用的不对吧请大神帮解释下这个灵异现象
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-7-29 07:36

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表