1. 程式人生 > 實用技巧 >PAT-1153(Decode Registration Card of PAT)+unordered_map的使用+vector的使用+sort條件排序的使用

PAT-1153(Decode Registration Card of PAT)+unordered_map的使用+vector的使用+sort條件排序的使用

Decode Registration Card of PAT

PAT-1153

  • 這裡需要注意題目的規模,並不需要一開始就儲存好所有的滿足題意的資訊
  • 這裡必須使用unordered_map否則會超時
  • vector的使用需要注意,只有一開始賦予了容量才能讀取。
  • 不需要使用set也可以
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
#include<cmath>
#include<vector> 
using namespace std;
const int maxn=10004;
int n,m;
struct Node{
	string code;
	char type;
	int site;
	string date;
	int number;
	int score;
	Node(){
	}
	Node(string co,char ty,int si,string da,int nu,int sc):
		code(co),type(ty),site(si),date(da),number(nu),score(sc){
		}
	bool operator<(const Node& node)const{
		if(score==node.score){
			return code<node.code;
		}else return score>node.score;
	}
	int times;
};
struct NType3{
	int site,times;
	NType3(){
	}
	NType3(int a,int b):site(a),times(b){
	}
	bool operator<(const NType3& node2)const{
		if(times==node2.times){
			return site<node2.site;
		}else return times>node2.times;
	}
};
set<Node>type1[26];
map<int,int>sit;
map<int,int>totscore;
map<int,int>dat[1000006];
set<NType3>type3[1000006];



int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		string code;int score;
		cin>>code>>score;
		char level=code[0];
		int site=stoi(code.substr(1,3));
		string date=code.substr(4,6);
		int number=stoi(code.substr(10));
//		cout<<level<<" "<<site<<" "<<date<<" "<<number<<endl;
		Node node=Node(code,level,site,date,number,score);
		sit[site]++;
		totscore[site]+=score;
		type1[level-'A'].insert(node);
		if(dat[stoi(date)][site]==0){
			set<NType3>te;
			te.insert(NType3(site,0));
			type3[stoi(date)].insert(NType3(site,0));
		}
		dat[stoi(date)][site]++;
	}
	for(int i=0;i<m;i++){
		int type;string s;
		cin>>type>>s;
		if(type==1){//level
			set<Node> now=type1[s[0]-'A'];
			set<Node>::iterator it;
			int num=0;
			for(it=now.begin();it!=now.end();it++){
				Node no=*it;
				cout<<no.code<<" "<<no.score<<endl;
				num++;
			}
			if(num==0)
				cout<<"NA"<<endl;
		}else if(type==2){//site
		    int numsit=sit[stoi(s)];
		    if(numsit==0){
		    	cout<<"NA"<<endl;
			}else cout<<sit[stoi(s)]<<" "<<totscore[stoi(s)]<<endl;
		}else{//date
			set<NType3> now=type3[stoi(s)];
			set<NType3> temp;
			for(set<NType3>::iterator it=now.begin();it!=now.end();it++){
				NType3 no=*it;
				int site=no.site;
				int times=dat[stoi(s)][site];
				no.times=times;
				temp.insert(no);
			}
			set<NType3>::iterator it;
			int num=0;
			for(it=temp.begin();it!=temp.end();it++){
				NType3 no=*it;
				cout<<no.site<<" "<<no.times<<endl;
				num++;
			}
			if(num==0)
				cout<<"NA"<<endl; 
		}
	}
	return 0;
} 
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
#include<cmath>
#include<vector> 
#include<unordered_map>
using namespace std;
const int maxn=10004;
int n,m;
struct Node{
	string code;
	int value;
};

bool cmp(Node& node1,Node& node2){
	if(node1.value==node2.value){
		return node1.code<node2.code;
	}else return node1.value>node2.value;
}
int main(){
	cin>>n>>m;
	vector<Node>v(n);//只有指定了容器大小才能使用下面輸入語句 
	for(int i=0;i<n;i++){
		string code;int score;
//		cin>>code>>score;
//		Node node;
//		node.code=code;
//		node.value=score;
//		v.push_back(node);
		cin>>v[i].code>>v[i].value; 
	}
	for(int i=1;i<=m;i++){
		int type;string s;
		cin>>type>>s;
		
        printf("Case %d: %d %s\n",i,type,s.c_str());
//		cout<<"Case "<<i<<": "<<type<<" "<<s<<endl;
		if(type==1){
			vector<Node>ve;
			for(Node item:v){
				if(item.code.substr(0,1)==s){
					ve.push_back(item);
				}
			}
			if(ve.size()==0)
				printf("NA\n");
			else{
				sort(ve.begin(),ve.end(),cmp);
				for(Node item:ve){
					printf("%s %d\n",item.code.c_str(),item.value);
//					cout<<item.code<<" "<<item.value<<endl;
				}
			}
		}else if(type==2){
			int num=0,tot=0;
			for(Node item:v){
				if(s==item.code.substr(1,3)){
					num++;
					tot+=item.value;
				}
			}
			if(num==0)
				printf("NA\n");
			else {
				printf("%d %d\n",num,tot);
//				cout<<num<<" "<<tot<<endl;
			}
		}else if(type==3){
			unordered_map<string,int>ma;
			for(Node item:v){
				if(s==item.code.substr(4,6)){
					string site=item.code.substr(1,3);
					ma[site]++;
				}
			}
			if(ma.size()==0)
				printf("NA\n");
			else{
				vector<Node>now;
				for(auto item:ma){
					now.push_back({item.first,item.second});
				}
				sort(now.begin(),now.end(),cmp);
				for(Node item:now){
					printf("%s %d\n",item.code.c_str(),item.value);
				}
			}
		}
	}
//	cout<<"jhjj"<<endl;
	return 0;
}