首页 > 其他分享 >PAT甲 1025 PAT Ranking

PAT甲 1025 PAT Ranking

时间:2024-02-18 16:14:08浏览次数:47  
标签:1025 Ranking PAT int sum vt 100 id

题目:

1080 Graduate Admission - PAT (Advanced Level) Practice (pintia.cn)

 

测试点4出现段错误,其他过了,找不出来哪里有问题。准备把别人代码复现一遍。

 

其他:

1、排序函数要用 & 引用传参,不然会超时

```

在排序函数中使用引用传递可以避免不必要的对象拷贝,从而提高排序的效率。如果没有使用引用传递,那么每次传递参数时都会复制一份对象,这在数据量较大时会增加额外的开销,导致排序速度变慢,甚至在数据量较大时可能会导致超时。
使用引用传递可以直接操作原始对象,而不是复制对象,因此可以提高效率。特别是在排序函数中,可能需要频繁地进行元素的交换或比较,如果每次都复制对象,会增加额外的开销,影响排序的性能。
因此,在排序函数中,应该使用引用传递参数,以避免不必要的性能损失。

```

2、有博主猜测测试点四是所有数据都一样

PAT 甲 1080 测试点4_pat 1080检测点-CSDN博客

他的测试数据我能通过

11 6 3 2 1 2 2 2 3 100 100 0 1 2 100 100 2 3 5 100 100 0 3 4 100 100 1 2 0 100 100 5 1 3 100 100 1 0 2 100 100 0 1 2 100 100 0 1 2 100 100 1 3 2 100 100 1 2 3 100 100 0 2 4

 3、我注释掉的这段代码会让输出为空,可能是出现了越界问题?没搞懂哪里出了问题,待解决。

    /*int num[110]={0},res[110]={0};
    int ss_id[110][40010];*/

 

完整:

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

struct stu{
    int c[5];
    int GE,GI;
    int rank,id;
    int sum=0;//与sum/2的排名一致
};
int cmp1(stu& a,stu& b){
    if(a.sum!=b.sum)
        return a.sum>b.sum;
    else
        return a.GE>b.GE;
}
int cmp2(int& a,int& b){
    return a<b;
}

int main(){
    int n,m,k;
    int i,j;
    /*int num[110]={0},res[110]={0};
    int ss_id[110][40010];*/
    if(scanf("%d %d %d",&n,&m,&k)==EOF)
        printf("error");
    int num[m]={0},res[m]={0};
    int ss_id[m+1][40001];
    for(i=0;i<m;i++){
        if(scanf("%d",&num[i])==EOF)
            printf("error");
    } 
    for(int i=0;i<m+1;i++){
        for(j=0;j<40000;j++)
            ss_id[i][j]=-1;//录取学生编号可能为0,故记录初始化为-1
    }

    vector<stu> vt(n);
    for(i=0;i<n;i++){
        if(scanf("%d %d",&vt[i].GE,&vt[i].GI)==EOF)
            printf("error");
        vt[i].sum=vt[i].GE+vt[i].GI;
        vt[i].id=i;
        for(j=0;j<k;j++){
            if(scanf("%d",&vt[i].c[j])==EOF)
                printf("error");
        }
    }
    sort(vt.begin(),vt.end(),cmp1);
    vt[0].rank=1;
    for(i=1;i<n;i++){
        if(vt[i].sum==vt[i-1].sum&&vt[i].GE==vt[i-1].GE)
            vt[i].rank=vt[i-1].rank;
        else
            vt[i].rank=i+1;
    }
    for(i=0;i<n;i++){
        for(j=0;j<k;j++){
            if(res[vt[i].c[j]]<num[vt[i].c[j]]){
                ss_id[vt[i].c[j]][res[vt[i].c[j]]++]=i;//选择存编号而不是id
                break;//不用再看后面志愿
            }else if(res[vt[i].c[j]]>=num[vt[i].c[j]]){//满名额看并列
                int last=ss_id[vt[i].c[j]][num[vt[i].c[j]]-1];//注意列坐标-1
                if(vt[i].rank==vt[last].rank){
                    ss_id[vt[i].c[j]][res[vt[i].c[j]]++]=i;
                    break;//不用再看后面志愿
                }else{
                    continue;//看下个志愿
                }
            }
        }//for j
    }
    for(i=0;i<m;i++){
        if(res[i]==0)
            printf("\n");
        else{
            vector<int> temp;
            for(j=0;ss_id[i][j]!=-1;j++){
                temp.push_back(vt[ss_id[i][j]].id);//输出编号
            }
            sort(temp.begin(),temp.end(),cmp2);
            for(j=0;j<(int)temp.size();j++){
                if(j==0)
                    printf("%d",temp[j]);
                else
                    printf(" %d",temp[j]);
            }
            printf("\n");
            //temp.clear();
        }
    }
    return 0;
}

 

标签:1025,Ranking,PAT,int,sum,vt,100,id
From: https://www.cnblogs.com/melusine/p/18019429

相关文章

  • Delphi 12 Patch1
    如果你升级到Delphi12,这个补丁是必须打的。官方也发布了ISO版本,如这个需要重新安装。https://altd.embarcadero.com/download/radstudio/12.0/radstudio_12_0_inline_116924a.isoQuality Portal Issues Addresses by This Patch (notice QP remains accessible in r......
  • Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)
    ​ Java中,正则表达式(regex)的处理是通过Pattern类实现的。Pattern类提供了多种标志(flags)来修改正则表达式的行为。其中,Pattern.MULTILINE和Pattern.DOTALL是两个常用的模式,它们分别用于处理多行文本和让.匹配包括行终止符在内的任意字符。 参考文档:Java中正则表达式(regex)匹......
  • SHGetSpecialFolderPath(NULL, path, CSIDL_PROGRAM_FILES_COMMONX86, 0)
    CStringstr;TCHARpath[MAX_PATH];BOOLb=SHGetSpecialFolderPath(NULL,path,CSIDL_PROGRAM_FILES_COMMONX86,0);//获取指定的系统路径/*参数1:HWNDhwndOwner窗口所有者的句柄。可以NULL参数2:LPTSTRlpszPath返回路径的缓冲区,该缓冲区的大......
  • PAT乙级-1009(说反话)
    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。......
  • Go 100 mistakes - #11: Not using the functional options pattern
      Here,WithPortreturnsaclosure.Aclosureisananonymousfunctionthatreferences variablesfromoutsideitsbody;inthiscase,theportvariable.Theclosurerespectsthe Optiontypeandimplementstheport-validationlogic.Eachconfigfieldr......
  • 设计模式--策略模式(Strategy Pattern)
    策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户端。策略模式主要包含以下几个角色:Strategy(策略):这是一个接口,通常用于定义所有支持的算法的公共接口。ConcreteStrategy(具体策略):这是实现了S......
  • CodeForces 1928F Digital Patterns
    洛谷传送门CF传送门为什么我场上被卡常了。转化题意,将\(a,b\)差分,答案为在\(a,b\)选出相同长度的不含\(0\)的子段方案数。设\(a\)选出长度为\(i\)的不含\(0\)的子段方案数为\(x_i\),\(b\)选出长度为\(i\)的不含\(0\)的子段方案数为\(y_i\)。答案为\(\su......
  • LD_LIBRARY_PATH和LIBRARY_PATH的区别
    LD_LIBRARY_PATH和LIBRARY_PATH在Linux系统中都是与动态链接库查找路径相关的环境变量,它们的主要区别在于使用阶段和作用:LIBRARY_PATH:作用于程序编译阶段,告诉编译器(如gcc)在编译时寻找动态链接库(.so文件)的附加搜索路径。当编译一个程序,并且该程序依赖于某些非标准路径下......
  • 设计模式--桥接模式(Bridge Pattern)
    桥接模式(BridgePattern)是一种结构型设计模式,它主要是用于将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式主要包含以下几个角色:Abstraction(抽象类):定义抽象类的接口,它维护对Implementor的引用。RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口。Implement......
  • POJ--3764 The xor-longest Path(Trie)
    记录13:562024-2-10找到俩个点,获得最大的边权异或值。利用异或的性质,一个值被异或俩次相当于没有异或即axorbxorb=a所以先从顶点出发,获得每个点路径上的异或值,然后对这俩个值进行异或就获得了他们之间路径的异或值。获取从顶点到每个点路径上的异或值后,可以利用trie来......