PAT练习(十一)

PAT1039A Course List for Student (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805447855292416

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
//三位大写字母和一位数字组成的名字 
int changeID(string name){
	int id=0;
	for(int i=0;i<name.length()-1;i++){
		id =id*26+(name[i]-'A');
	}
	id=id*10+(name[3]-'0');
	return id;
	
} 
int main(){
	int m,n;
	cin>>m>>n;
    int maxn=26*26*26*10+10;
	vector<int> coures[maxn];
	for(int i=0;i<n;i++){
		int k,cnt;
		cin>>k>>cnt;
		for(int j=0;j<cnt;j++){
			string name;
			cin>>name;
			int id=changeID(name);
			coures[id].push_back(k);
		}
	}
	
	for(int i=0;i<m;i++){
		string name;
		cin>>name;
		int id=changeID(name);
		sort(coures[id].begin(),coures[id].end());
		cout<<name<<" "<<coures[id].size();
		for(int j=0;j<coures[id].size();j++){
			cout<<" "<<coures[id][j];
		}
		cout<<endl;
	}
	return 0;
}

PAT1047A Student List for Course (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805433955368960

测试点3运行超时

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
//不向容器中添加字符串,添加学生编号,对应学生姓名数组 
using namespace std;
const int stuMax=40010;
const int courseMax=2510;
char name[stuMax][5];
vector<int> course[courseMax];
bool cmp(int a,int b){
	if(a!=b) return strcmp(name[a],name[b])<0;
}
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=0;i<n;i++){
		int m=0;
		scanf("%s %d",&name[i],&m);
		for(int j=0;j<m;j++){
			int c=0;
			cin>>c;
			course[c].push_back(i);
		}
	}
	//课程号从1开始到k 
	for(int i=1;i<=k;i++){
		sort(course[i].begin(),course[i].end(),cmp);
		cout<<i<<" "<<course[i].size()<<endl;
		for(int j=0;j<course[i].size();j++){
			cout<<name[course[i][j]]<<endl;
		}
	}
	return 0;
}

PAT1063A Set Similarity (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805409175420928
答案错误待改,不知道哪儿有错

#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
using namespace std;
set<int> num[51];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int m;
		cin>>m;
		for(int j=0;j<m;j++){
			int h;
			cin>>h;
			num[i].insert(h);
		}
	}
	
	int k;
	cin>>k;
	for(int i=0;i<k;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		int cnt=0,count=num[a].size()+num[b].size();
		for(set<int>::iterator it=num[b].begin();it!=num[b].end();it++){	
			if(num[a].find(*it)==num[a].end()){
				count--;
				cnt++;
			}
		}	
		double rs=cnt*100.0/count;
		printf("%.1f",rs);
		cout<<"%"<<endl;
	}
	return 0;
}

算法笔记方法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
set<int> st[51];
void compare(int x, int y) {
    int num = st[y].size(), sameNum = 0;
    for(set<int>::iterator it = st[x].begin(); it != st[x].end(); it++) {
        if(st[y].find(*it) != st[y].end()) {
            sameNum++;
        } else {
            num++;
        }
    }
    printf("%.1f%%\n", sameNum * 100.0 / num);
}
int main() {
    int n, k, q, v, st1, st2;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &k);
        for(int j = 0; j < k; j++) {
            scanf("%d", &v);
            st[i].insert(v);
        }
    }
    scanf("%d", &q);
    for(int i = 0; i < q; i++) {
        scanf("%d%d", &st1, &st2);
        compare(st1, st2);
    }
    return 0;
}

PAT1060A Are They Equal (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
string getRs(string str,int& num1){
	int k=0,num=0;
	string res;
	while(str.length()>0&&str[0]=='0'){ 
		str.erase(str.begin());
	} 
	 if(str[0]=='.'){
	 	str.erase(str.begin());
	 	while(str.length()>0&&str[0]=='0'){
	 		str.erase(str.begin());
	 		num1--;
		 }
	 }
	 else{
	 	//未发现小数点,整数部分仍有有效数字 
	 	while(str.length()>k&&str[k]!='.'){
	 		k++;
	 		num1++;
		 }
		 //循环结束后,k小于长度,说明遇到小数点
		 if(k<str.length()){
		 	str.erase(str.begin()+k);
		 } 
	 }
	 //出掉0后,字符串清空,说明为0
	 if(str.length()==0){
	 	num1=0;
	 } 
	 k=0;
	 while(num<n){
	 	//将str中有效部分加入 
	 	if(k<str.length()){
	 		res+=str[k++];
		 }
		 //res长度不够要求进度,加入0
		 else{
		 	res+='0';
		 } 
		 num=num+1;
	 }
	 return res;
	
}
int main(){
	string a,b,c,d;
	int num3=0,num2=0;
	cin>>n>>a>>b;
	c=getRs(a,num3);
	d=getRs(b,num2);
	if(c==d&&num3==num2){
		cout<<"YES 0."<<c<<"*10^"<<num3<<endl;
	}
	else{
		cout<<"NO 0."<<c<<"*10^"<<num3<<" 0."<<d<<"*10^"<<num2<<endl;
	}
	
	return 0;
}

PAT1100AMars Numbers (20 分)/1044B

https://pintia.cn/problem-sets/994805342720868352/problems/994805367156883456
*scanf("%d%c",&n); 通过% * c防止读取一个空格

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<string,int> strTonum;
string numTostr[170];
string mars[13]={"tret","jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string digitMars[13]={"tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int main(){

	for(int i=1;i<13;i++)
	{
		for(int j=1;j<13;j++){
			int num=i*13+j;
			numTostr[num]=digitMars[i]+" "+mars[j];
			string ma=digitMars[i]+" "+mars[j];
			strTonum[ma]=num;	
		}
	} 
	for(int i=0;i<13;i++){
		//只有个位数 
		numTostr[i]=mars[i];
		strTonum[mars[i]]=i;
		//没有个位数,只有十位数 
		numTostr[i*13]=digitMars[i];
		strTonum[digitMars[i]]=i*13;
	}
	int n;
	scanf("%d%*c",&n);
	for(int i=0;i<n;i++){
		string a;
		getline(cin,a);
		if(a[0]>='0'&&a[0]<='9'){
			int key=0;
			for(int i=0;i<a.length();i++){
				key=key*10+(a[i]-'0');
			}
			cout<<numTostr[key]<<endl; 
		}
		else{
			cout<<strTonum[a]<<endl;
		}
	}
	return 0;
}在这里插入代码片

PAT1054A The Dominant Color (20 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805422639136768

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;

int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	map<int,int> colorCnt;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			int num;
			scanf("%d",&num);
			colorCnt[num]++;
		}
	}
	int total=m*n;
	int k=0,max=0;
	for(map<int,int>::iterator it=colorCnt.begin();it!=colorCnt.end();it++){
		if(it->second>max){
			k=it->first;
			max=it->second;
		}
	}
	cout<<k<<endl;

	return 0;
}

PAT1071A peech Patterns (25 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805398257647616

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
bool check(char c){
	if(c>='0'&&c<='9') return true;
	else if(c>='a'&&c<='z') return true;
	else if(c>='A'&&c<='Z') return true;
	else return false;
}
int main(){
	map<string,int> cnt;
	string a;
	getline(cin,a);
	int index=0;
	while(index<a.length()){
		string world="";
		//读取一个词组 
		while(index<a.length()&&check(a[index])==true){
			if(a[index]>='A'&&a[index]<='Z'){
				a[index]=a[index]-'A'+'a';
			} 
			world+=a[index];
			index++;
		}
		if(world!=""){
			cnt[world]++;
		}
		
		if(check(a[index])==false){
			index++;
		}
		
	}
		
	string rs;
	int  max=0;
	for(map<string,int>::iterator it=cnt.begin();it!=cnt.end();it++){
		if(it->second>max){
			rs=it->first;
			max=it->second;
		}
	}
	cout<<rs<<" "<<max<<endl;
	
	return 0;
}

PAT1022A Digital Library (30 分)

https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336

#include<iostream>
#include<cstdio>
#include<map>
#include<set> 
#include<cstring>
using namespace std;
//通过set实现对id的有序排序 
map<string,set<int>> title,author,key,publisher,published;
//输出符合条件的内容
void show(map<string,set<int>> &m,string &str){
	if(m.find(str)==m.end()){
		cout<<"Not Found"<<endl;
	} 
	else{
		//存在以str为下标的几何元素,直接输出存入的value值 
		for(set<int>::iterator it=m[str].begin();it!=m[str].end();it++){
			printf("%07d\n",*it);
		}
	}
} 
int main(){
	int n;
	scanf("%d%*c",&n);
	for(int i=0;i<n;i++){
		int id;
		scanf("%d%*c",&id);
		string value;
		getline(cin,value);
		title[value].insert(id);
		getline(cin,value);
		author[value].insert(id);
		//关键字一行显示多个,以空格分隔 
		while(cin>>value){
			key[value].insert(id);
			char c=getchar();
			if(c=='\n'){
				break;
		}
	}
		getline(cin,value);
		publisher[value].insert(id);
		getline(cin,value);
		published[value].insert(id);
	}
	int m,k;
	cin>>m;
	for(int i=0;i<m;i++) {
		string str;
		scanf("%d: ",&k);
		getline(cin,str);
		cout<<k<<": "<<str<<endl;
		if(k==1){
			show(title,str);
		}
		else if(k==2){
			show(author,str);
		}
		else if(k==3){
			show(key,str);
		}
		else if(k==4){
			show(publisher,str);
		}
		else{
			show(published,str);
		}
	}
	return 0;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 6126

猜你喜欢

转载自blog.csdn.net/didadu/article/details/100178018