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. 参考资料
米有~