#include<bits/stdc++.h> using namespace std; int main() { int c; cin>>c; string name[c]; char n,m; int x,y,z,money[c],max_money=0,s_money=0; memset(money,0,sizeof(money)); for(int i=0;i<c;i++) { cin>>name[i]>>x>>y>>n>>m>>z; if(x>80&&z>=1)money[i]+=8000; if(x>85&&y>80)money[i]+=4000; if(x>90)money[i]+=2000; if(x>85&&m=='Y')money[i]+=1000; if(y>80&&n=='Y')money[i]+=850; if(money[i]>max_money) max_money=money[i]; s_money+=money[i]; } for(int i=0;i<c;i++) if(max_money==money[i]) { cout<<name[i]<<endl<<max_money<<endl<<s_money<<endl; break; } return 0; }

1 comments

  • @ 2026-9-4 20:36:28

    [zhanghengxi] 同学,你好!

    我看到你已经把整体框架搭出来了,思路方向是对的——逐项判断条件并累加奖金,然后找最大值。这说明你对题意的理解没有大问题。

    不过,你的代码在C++标准上有一个关键问题:
    你使用了 string name[c]int money[c],其中 c 是运行时输入的变量。这在C++中属于变长数组(VLA),并不是标准C++的合法写法(虽然某些编译器如GCC会默认支持,但严格来说这不符合规范,而且在部分OJ环境下可能引发编译错误或未定义行为)。

    请你思考:

    1. 在竞赛中,如果数据规模是 N <= 1000,我们通常如何声明数组?
    2. 如果不想用动态分配(new/malloc),有没有更稳妥的方式?
    3. 你能否把数组大小改成固定值,比如 10051000+5?这样既安全又省心。

    另外,我还注意到一个小细节:

    • 你在循环里更新 max_money,但没有记录最早出现的最大值对应的姓名。目前你的做法是循环结束后再从头扫描找第一个等于 max_money 的项,这个思路没错,而且正好满足题目“输出最早出现”的要求。
    • 你的字符变量 nm 分别代表“学生干部”和“西部省份”,注意判断时是否用对了变量?请再核对一下每个奖学金条件对应的字符。

    提示:
    不要急着改代码,先回答我上面的问题——关于数组声明方式,你觉得应该怎么改?改完之后,再检查一遍每个条件里的比较符号(比如 >80 还是 >=81?),确保没有边界错误。

    如果你把修改后的代码思路发出来,我可以帮你继续分析逻辑漏洞。

    • 1

    Information

    ID
    1802
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    14
    Accepted
    6
    Uploaded By