pat-07排序部分stl应用

//1022 
#include<bits/stdc++.h>
using namespace std;//除了要注意换行符的吸收  还有注意年份的格式是%04d  编号的输出格式是%07d容易遗忘 
 map<string,set<int>>booktitle,author,keyword,publiser;//输出格式问题最后一定要点出来 
 map<int,set<int>>year;
 int main(){
 	int n;
 	scanf("%d",&n);
 	getchar();
    long long int _1;
 	string _2,_3,_4,_5;
 	int _6; 
 	for(int i=0;i<n;i++){
 		scanf("%lld",&_1);
 		getchar();
 		getline(cin,_2);
 		booktitle[_2].insert(_1);
 		getline(cin,_3);
 		author[_3].insert(_1);
 		while(cin>>_4){
 			keyword[_4].insert(_1);
			 if(getchar()=='\n'){
 				break;
			 }
		 }
		 getline(cin,_5);
		 publiser[_5].insert(_1) ;
		 scanf("%d",&_6);
		 getchar();
		 year[_6].insert(_1);
	 }
	 int k,_7,_8;
	 string temp;
	 scanf("%d",&k);
	 getchar();
	 for(int i=0;i<k;i++){
	 	scanf("%d: ",&_7);
	 	printf("%d: ",_7);
	 	//getchar();分段部分输入不用带getchar 
	 	if(_7==1){
	 		getline(cin,temp);
	 		printf("%s\n",temp.c_str());
	 		if(booktitle[temp].size()!=0)
	 		for(auto it=booktitle[temp].begin();it!=booktitle[temp].end();it++){
	 			printf("%07d\n",*it);
			 }else printf("Not Found\n");
		 }
		 else if(_7==2){
		 	getline(cin,temp);
	 		printf("%s\n",temp.c_str());
	 		if(author[temp].size()!=0)
	 		for(auto it=author[temp].begin();it!=author[temp].end();it++){
	 			printf("%07d\n",*it);
			 }else printf("Not Found\n");
		 }else if(_7==3){
		 	cin>>temp;
		 		printf("%s\n",temp.c_str());
		 		if(keyword[temp].size()!=0)
	 		for(auto it=keyword[temp].begin();it!=keyword[temp].end();it++){
	 			printf("%07d\n",*it);
			 }else printf("Not Found\n");
		 	
		 }else if(_7==4){
		 		getline(cin,temp);
	 		printf("%s\n",temp.c_str());
	 		if(publiser[temp].size()!=0)
	 		for(auto it=publiser[temp].begin();it!=publiser[temp].end();it++){
	 			printf("%07d\n",*it);
			 }else printf("Not Found\n");
		 }else if(_7==5){
		 	scanf("%d",&_8);//没加& 
		 	getchar();
		 	printf("%04d\n",_8);
		 	if(year[_8].size()!=0)
		 	for(auto it=year[_8].begin();it!=year[_8].end();it++){
	 			printf("%07d\n",*it);
			 }else printf("Not Found\n");
		 }
      }
	 return 0;
 }
//1025  格式输出%013样例中故意不给你前面缺位的情况 
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long int id;
	int score;
	int location;
	int lrank;
	int frank; 
}; 
bool cmp(node&a,node&b){
	if(a.score!=b.score) return a.score>b.score;
	else return a.id<b.id;
}
vector<node> ans,loc;
int main(){
	int n,m,sum=0,_2;
	long long _1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&m);
		loc.clear();
		sum+=m;
		for(int j=0;j<m;j++){
			scanf("%lld%d",&_1,&_2);
			loc.push_back({_1,_2,i});
		}
		sort(loc.begin(),loc.end(),cmp);
		loc[0].lrank=1;
		ans.push_back(loc[0]);
		for(int q=1;q<loc.size();q++){
			loc[q].lrank=loc[q-1].score==loc[q].score? loc[q-1].lrank:q+1;
		    ans.push_back(loc[q]);
		}
	}
	sort(ans.begin(),ans.end(),cmp);
	ans[0].frank=1;
	for(int i=1;i<ans.size();i++){
		ans[i].frank=ans[i-1].score==ans[i].score?ans[i-1].frank:i+1;
	}
	printf("%d\n",sum);
	for(int i=0;i<sum;i++){
		printf("%013lld %d %d %d\n",ans[i].id,ans[i].frank,ans[i].location,ans[i].lrank);
	} 
	return 0;
}
//1028
#include<bits/stdc++.h>
using namespace std;
struct node{
	int id;
	string name;
	int grade;
};
int c;
bool cmp1(node&a,node&b){
	if(c==1){
		return a.id<b.id;
	}else if(c==2){
		if(a.name!=b.name)
		return a.name<b.name;
		else return a.id<b.id;
	}else if(c==3){
		if(a.grade!=b.grade){
			return a.grade<b.grade;
		}else{
			return a.id<b.id;
		}
	}
}
vector<node> ans;
int main(){
	int n,_1,_3;
	string _2;
	scanf("%d%d",&n,&c);
	for(int i=0;i<n;i++){
		cin>>_1>>_2>>_3;
		ans.push_back({_1,_2,_3});
	}
	sort(ans.begin(),ans.end(),cmp1);
	for(int i=0;i<n;i++){
		printf("%06d %s %d\n",ans[i].id,ans[i].name.c_str(),ans[i].grade);
	}
	return 0;
}
//1039
#include<bits/stdc++.h>
using namespace std;
map<string,set<int>> ans;
int main(){
	int n,k,_1,_2;
	string _3;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d",&_1,&_2);
		for(int j=0;j<_2;j++){
			cin>>_3;
			ans[_3].insert(_1) ;
		}
	}
	string _4; 
	for(int i=0;i<n;i++){
		cin>>_4;
		printf("%s",_4.c_str());
		printf(" %d",ans[_4].size());
		for(auto it=ans[_4].begin();it!=ans[_4].end();it++){
			printf(" %d",*it);
		}
		printf("\n");
	}
	return 0;
}
//1041
#include<bits/stdc++.h>
using namespace std;
int book[100009];
vector<int> ans;
int main(){
	int n,_1;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&_1);
		book[_1]++;
		ans.push_back(_1);
	}
	int flag=1;
	for(int i=0;i<ans.size();i++){
		if(book[ans[i]]==1){
			printf("%d",ans[i]);
	        flag=0;
			break;
		}
	}
	if(flag==1){
		printf("None");
	}
	return 0;
}
//1047
#include<bits/stdc++.h>
using namespace std;
bool cmp(string &a,string &b){
	return a<b;
}
map<int,vector<string>>ans;
int main(){
	int n,m,_2,_3;
	string _1;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		cin>>_1>>_2;
		for(int j=0;j<_2;j++){
			scanf("%d",&_3);//输入不全忘加& 
			ans[_3].push_back(_1);
		}
	}
	for(int i=1;i<=m;i++){
		sort(ans[i].begin(),ans[i].end(),cmp);
		printf("%d %d\n",i,ans[i].size());
		for(auto it=ans[i].begin();it!=ans[i].end();it++){
			string temp=*it;
			printf("%s\n",temp.c_str());
		}
	}
	return 0;
}
//1048   分一下全局答案与局部答案,哪些答案是需要全部遍历完才能得到的,不能直接在循环内判断得出的为全局答案 
#include<bits/stdc++.h>
using namespace std;
int book[1010];
vector<int> ans;
int main(){
	int n,m,_1;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d",&_1);
		ans.push_back(_1);
		book[_1]++;
	}
	sort(ans.begin(),ans.end());
	int flag=1; 
	for(int i=0;i<ans.size();i++){
		if(book[m-ans[i]]>0){
			if(m-ans[i]==ans[i]&&book[m-ans[i]]>=2){//相当于等于中的子集,下面也有可能等于 
				printf("%d %d",ans[i],ans[i]);
				flag=0;
				break;
			}else if(m-ans[i]!=ans[i]){//所以要特定限制 
				printf("%d %d",ans[i],m-ans[i]);
				flag=0;
				break;
			}/*else{
				printf("No Solution");
				break;//输入完后直接break 
			}*///no  solution 要等都遍历完才能判断有没有 需要全局答案 
		}
	}
	if(flag==1){
		printf("No Solution");
	}
	return 0;
}

7道

总结

原来一个未解决的题1025是因为最后的格式问题忘记%013解决,输出时一定要点一下格式

1048 分一下 全局答案和局部答案 有些答案不能直接在循环中判断输出,要整个遍历完才能得出答案

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值