算法训练26


1. 知识点总结

1h全部AC~

话说昨天没来得及更新是因为3h只写了三道题,卡在了一道贪心问题(其实也不难)上。

题目 难度 知识点
1035 Password 🎯 字符串
1036 Boys vs Girls 🎯 数组
1037 Magic Coupon 🎯 数学
1038 Recover the Smallest Number 🎯 很经典的排序题目

2. 分题题解

2.1 1035 Password

简单的字符串处理问题……水题

#include<bits/stdc++.h>
using namespace std;
int n,cnt=0;
struct User{
	string name;
	string pwd;
	bool isModified;
};
bool modify(string &pwd){
	int len=pwd.length();
	bool flag=false;
	for(int i=0;i<len;i++){
		if(pwd[i]=='1'){
			pwd[i]='@';
			flag=true;
		}else if(pwd[i]=='0'){
			pwd[i]='%';
			flag=true;
		}else if(pwd[i]=='l'){
			pwd[i]='L';
			flag=true;
		}else if(pwd[i]=='O'){
			pwd[i]='o';
			flag=true;
		}
	}
	if(flag){
		cnt++;
		return true;
	}
	return false;
}
int main(){
	scanf("%d",&n);
	vector<User>user(n);
	for(int i=0;i<n;i++){
		cin>>user[i].name>>user[i].pwd;
		user[i].isModified=modify(user[i].pwd);
	}
	if(cnt==0){
		if(n==1){
			printf("There is %d account and no account is modified",n);
		}else{
			printf("There are %d accounts and no account is modified",n);
		}
	}else{
		printf("%d\n",cnt);
		for(int i=0;i<n;i++){
			if(user[i].isModified){
				cout<<user[i].name<<" "<<user[i].pwd<<"\n";
			}
		}
	}
	return 0;
} 

2.2 1036 Boys vs Girls

水题……主要是练练自己的代码风格(简称没有风格啊哈哈哈)

#include<bits/stdc++.h>
using namespace std;
struct Student{
	char name[12];
	char gender;
	char id[12];
	int grade;
};
int n;
vector<Student>student;
Student male;bool flag_male=false;
Student female;bool flag_female=false;
int main(){
	scanf("%d",&n);
	student.resize(n);
	for(int i=0;i<n;i++){
		scanf("%s %c %s %d",&student[i].name,&student[i].gender,&student[i].id,&student[i].grade);
		if(student[i].gender=='M'){
			if(flag_male==false){
				male=student[i];
				flag_male=true;
			}else{
				if(student[i].grade<male.grade){
					male=student[i];
				}
			}
		}else{
			if(flag_female==false){
				female=student[i];
				flag_female=true;
			}else{
				if(student[i].grade>female.grade){
					female=student[i];
				}
			}
		}
	}
	if(flag_female){
		printf("%s %s\n",female.name,female.id);
	}else{
		printf("Absent\n");
	}
	if(flag_male){
		printf("%s %s\n",male.name,male.id);
	}else{
		printf("Absent\n");
	}
	
	if(flag_male&&flag_female){
		printf("%d",female.grade-male.grade);
	}else{
		printf("NA");
	}
	return 0;
}

2.3 1037 Magic Coupon

其实是一道简单的贪心问题,尽可能让最小的负数相乘,以及最大的正数相乘,实在只能配对到正×负的情况下就“摆烂为0”

#include<bits/stdc++.h>
using namespace std;
//负数和负数相乘,正数和正数相乘
int ans=0;
int n,m;
vector<int>coupons;
vector<int>products; 

int main(){
	scanf("%d",&n);
	coupons.resize(n);
	for(int i=0;i<n;i++){
		scanf("%d",&coupons[i]);
	}
	sort(coupons.begin(),coupons.end());
	scanf("%d",&m);
	products.resize(m);
	for(int i=0;i<n;i++){
		scanf("%d",&products[i]);
	}
	sort(products.begin(),products.end());
	//首先是负数
	int j=0;
	for(int i=0;i<n&&coupons[i]<0;i++){
		//printf("cou:%d\n",coupons[i]);
		for(;j<m&&products[j]<0;){
			//printf("%d %d %d\n",coupons[i],products[j],coupons[i]*products[j]);
			ans+=coupons[i]*products[j];
			products[j]=0;
			j++;
			break;
		}
	} 
	//接着是正数
	j=m-1;
	for(int i=n-1;i>=0&&coupons[i]>0;i--){
		//printf("cou:%d\n",coupons[i]);
		for(;j>=0&&products[j]>0;){
			//printf("%d %d %d\n",coupons[i],products[j],coupons[i]*products[j]);
			ans+=coupons[i]*products[j];
			products[j]=0;
			j--;
			break;
		}
	} 
	printf("%d",ans);
	return 0;
}

2.4 1038 Recover the Smallest Number

非常经典的一道题目了,主要看cmp函数的写法,属于想到了会超级easy但是没想到就很复杂的一道题( ̄▽ ̄)*

#include<bits/stdc++.h>
using namespace std;
//
bool cmp(string a,string b){
	return a+b<b+a;
} 
int n;
vector<string>v;
bool flag=false;
string ans="";
int main(){
	scanf("%d",&n);
	v.resize(n);
	for(int i=0;i<n;i++){
		cin>>v[i];
	}
	sort(v.begin(),v.end(),cmp);
	for(int i=0;i<n;i++){
		ans+=v[i];
	}
	for(int i=0;i<ans.length();i++){
		if(!flag&&ans[i]=='0'){
			continue;
		}
		if(ans[i]!='0'){
			flag=true;
		}
		printf("%c",ans[i]);
	}
	if(!flag){
		printf("0");
	}
	return 0;
}

3. 参考资料

米有~


文章作者: Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gao !
评论
  目录