A1141 PAT Ranking of Institutions

1.用map做string道double的映射
2.遍历所有映射,放进结构体数组,然后按要求排序
3.有的题解说map会超时,我的程序没有出现这个问题,最大运行时间到400多ms,如果真的超时用unordered_map
4.计算TWS的时候不用吧BAT都算出来在加权求和,实时加权求和一样的
5.sort只到len长度,一开始写了到n,结果最后一个点一直错

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

struct node{
	string SCH;
	double TWS;
	int NS;
};
bool cmp(node a,node b)
{
	if((int)a.TWS != (int)b.TWS)return a.TWS > b.TWS;
	else if(a.NS != b.NS)return a.NS < b.NS;
	else return a.SCH < b.SCH;
	
}
int main()
{
	int n;
	scanf("%d",&n);
	string id,sch;
	int grade;
	map<string,node> mp;
	for(int i=0;i<n;i++){
		cin>>id>>grade>>sch;
		for(int j=0;j<sch.length();j++){	//转换为小写 
			if(sch[j]>='A' && sch[j]<='Z'){
				sch[j] += 'a'-'A';
			}
		}
		if(id[0]=='B')mp[sch].TWS += 1.0*grade/1.5;
		if(id[0]=='A')mp[sch].TWS += 1.0*grade;
		if(id[0]=='T')mp[sch].TWS += 1.0*grade*1.5;
		mp[sch].NS++;
	}
	node S[n];			//将map映射放入结构体数组,方便排序 
	int len = 0;
	for(map<string,node>::iterator it=mp.begin();it!=mp.end();it++){
		S[len] = it->second;
		S[len].SCH = it->first;
		len++;
	}
	sort(S,S+len,cmp);			//排序 
	printf("%d\n",len);			//sch个数 
	int rank = 1;				//排名 
	for(int i=0;i<len;i++){
		if(i>=1 && (int)S[i].TWS < (int)S[i-1].TWS)rank = i+1;
		printf("%d ",rank);
		cout<<S[i].SCH;
		printf(" %d %d\n",(int)S[i].TWS,S[i].NS);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43108373/article/details/84204471