还是c++好用,三部分输入直接用相同的方法,
用map映射保存学生在结构体数组中的下标。
结构体保存学生信息,其中期末成绩直接初始化为-1,
注意四舍五入
此题还算简单

#include<iostream>
#include<stdio.h>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
struct stu{
    string name;
    int gp = -1, gm = -1, gf = -1, G = 0;
}arr[30000];
int num=0;
bool cmp(stu A,stu B){
    if(A.G!=B.G) return A.G>B.G;
    else return A.name<B.name;
}
int main() {

    int P, M, N; 
    scanf("%d%d%d", &P, &M, &N);
    map<string, int> mp;            //mp用来保存学生结构体在数组中的下标
    for (int i = 0; i<P; i++) {//在线编程
        string id; int score;
        cin >> id >> score;
        if(mp.count(id)==0){//如果学生第一次出现
            mp[id] = num++;
            arr[mp[id]].name = id;
        }
        arr[mp[id]].gp=score;
    }
    for (int i = 0; i<M; i++) {//其中
        string id; int score;
        cin >> id >> score;
        if(mp.count(id)==0){//如果学生第一次出现
            mp[id] = num++;
            arr[mp[id]].name = id;
        }
        arr[mp[id]].gm=score;
    }
    for (int i = 0; i<N; i++) {//期末
        string id; int score;
        cin >> id >> score;
        if(mp.count(id)==0){//如果学生第一次出现
            mp[id] = num++;
            arr[mp[id]].name = id;
        }
        arr[mp[id]].gf=score;

    }
    for(int i=0;i<num;i++){
        if(arr[i].gm>arr[i].gf)
            arr[i].G=(int)(arr[i].gm*0.4+arr[i].gf*0.6+0.5);
        else
            arr[i].G=arr[i].gf;
    }
    sort(arr,arr+num,cmp);
    for(int i=0;i<num;i++){
        if(arr[i].gp>=200&&arr[i].G>=60){
            cout<<arr[i].name;
            printf(" %d %d %d %d\n",arr[i].gp,arr[i].gm,arr[i].gf,arr[i].G);
        }
    }
    return 0;
}