当前位置: 代码迷 >> 综合 >> PAT 甲级 1041 PAT Ranking 个人错误总结
  详细解决方案

PAT 甲级 1041 PAT Ranking 个人错误总结

热度:27   发布时间:2024-02-07 03:58:39.0

哈哈哈,不知道我咋想的,用了挺复杂的方式做出来,结果一看柳神,直接用一个数组记录顺序就行了。。
主要是一开始就没有思考,一看简单题就上了,结果发现想的太简单了,重写又不方便,就会走很多弯路,以后20分的题也要想一下再写。
我一开始以为就是建立一个hash表读进来了置1,然后遍历一遍,第一个1的输出就行了。结果输出第一个样例是17。。。
然后我就想怎么办,如何在hash表中建立一个按照输入顺序。然后试了unordered map不行,也是17,我就想这一个数组,最多包含一个数据,不可能同时有被选中1次和输入顺序,然后一想好像也能,一个数字,被选中1次才置位,这个信息就包含了两个信息。但是有个问题,如果循环找一个序号不按照顺序的数组没有办法的,除非sort,但是sort有破坏了hash表的下标,我就建立一个struct,终于搞定了。
结果一看柳神,直接用另一个数组存顺序就行了,因为另一个数组又两个数的对应关系,实际上两个数组相当于3个数据联系起来了。啊啊啊,我这时感到我干了一件愚蠢的事啊哈哈哈。
甚至最后有一个点过不了,原来是数组开小了。。。

#include<bits/stdc++.h>
using namespace std;
struct node{int list=0;int num=10020;
}h[10000];
bool cmp(node a,node b){return a.num<b.num;
}
int main(){int n,temp;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&temp);h[temp].list=temp;if(h[temp].num!=10020) h[temp].num=10010;else h[temp].num=i;}sort(h,h+10000,cmp);if(h[0].num!=10010&&h[0].num!=10020) printf("%d",h[0].list);else printf("None");return 0;
}