PTA 天梯赛 L1

2023-04-20,,

L1-002 打印沙漏

细节:就是在  (i>j&&i+j<r+1) 这个区间里才有空格,然后就是 for 循环   for(r=1; ;r+=2)  条件不满足之后还会再+2;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
int n;
char c;
scanf("%d %c",&n,&c);
// int r=1,sum=1;
// for(r=3;sum<=n ;r+=2){
// sum+=r*2;
// }
// sum-=r*2;
// r-=2;
int r=,sum=;
for(r=; ;r+=){
if(r==)sum+=r;
else sum+=r<<;
if(sum>n)break;
}
sum-=r<<;
r-=;
// cout<<sum<<" "<<r<<endl;
for(int i=;i<=r;i++){
for(int j=;j<=r;j++){
if(i<=j&&i+j<=r+||i>=j&&i+j>=r+)cout<<c;
else if(i>j&&i+j<r+) cout<<" "; }
cout<<endl;
}
cout<<n-sum<<endl;
return ;
}

L1-003

搞个map即可,然后注意map只能从first  映射到second

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
string s;
cin>>s;
map<int,int>mp;
int len=s.size();
for(int i=;i<len;i++){
mp[s[i]-'']++;
}
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
cout<<it->fi<<":"<<it->se<<endl;
}
return ;
}

L1-006 连续因子

解法:就是你把他的全部因子求出来,然后去枚举每一个因子的最大连续次数,最后取一个最大值即可;

然后如果n是素数,输出n即可;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){
int n;
cin>>n;
vector<int>v;
int ans,max=-;
for(int i=;i<=sqrt(n)+;i++){
if(n%i==)v.pb(i);
}
int len=v.size();
for(int i=;i<len;i++){
int sum=v[i],cnt=;
for(int j=v[i]+; ;j++){
sum*=j;
if(n%sum!=)break;
cnt++;
}
if(cnt>max){
ans=v[i];
max=cnt;
}
}
if(len==)cout<<<<endl<<n<<endl;
else {
cout<<max+<<endl;
for(int i=;i<=max;i++){
if(i)cout<<"*";
cout<<ans+i;
}
cout<<endl;
}
return ;
}

L1-008 求整数段和

细节,最后不要打出两个换行即可;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
int main(){ int a,b;
cin>>a>>b;
ll sum=;
int i,j;
for(i=a,j=;i<=b;j++,i++){
printf("%5d",i);
sum+=i;
if(j%==)printf("\n");
}
if((j-)%!=)printf("\n");
printf("Sum = %d",sum);
// cout<<"Sum = "<<sum<<endl;
return ; }

L1-009 N个数求和

细节:这里就是模拟通分,然后注意每一步都要约分,不然爆long long,然后这里我犯一些细节错误,就是

判断语句应该这样写: if(a/b!=0&&a%b!=0)

而不是这样:

if(a>=b&&a%b!=0)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b){return b==?a:gcd(b,a%b);}
int main(){
int n;
scanf("%d",&n);
ll g,a,b,c,d;
scanf("%lld/%lld",&a,&b);
g=gcd(a,b);
a/=g;
b/=g;
for(int i=;i<n;i++){
scanf("%lld/%lld",&c,&d);
ll tmp=gcd(b,d);
a=a*d/tmp+c*b/tmp;
b=b/gcd(b,d)*d;
g=gcd(a,b);
a/=g;
b/=g;
}
if(a>&&b<||a<&&b<)a=-a,b=-b; if(a>=b&&a%b!=)printf("%lld %lld/%lld\n",a/b,a%b,b);
else if(a/b!=&&a%b==)printf("%lld\n",a/b);
else if(a/b==&&a!=)printf("%lld/%lld\n",a,b);
else puts(""); return ;
}

就是考虑负数的情况这样就不对了;

L1-020 帅到没朋友

注意是五位ID就行了,然后搞个set判重,vector保存结果;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e6+;
bool flag[maxn];
int main(){
int n,k,m,x;
scanf("%d",&n);
memset(flag,,sizeof flag);
while(n--){
scanf("%d",&k);
rep(i,,k){
scanf("%d",&x);
if(k>)flag[x]=;
}
}
set<int>st;
scanf("%d",&m);
vector<int>v;
while(m--){
scanf("%d",&x);
if(!flag[x]&&st.find(x)==st.end())v.pb(x);
if(!flag[x])st.insert(x);
}
if(st.empty())cout<<"No one is handsome";
else {
for(int i=;i<v.size();i++)
printf("%.5d%c",v[i],i==v.size()-?'\n':' ');
}
return ;
}

L1-025 正整数A+B

就是写个函数操作会很方便,要学会结构化程序设计;

然后注意读入的时候第二个要用getline读入

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e6+;
int f(string s){
int num=;
int len=s.size();
for(int i=;i<len;i++)if(s[i]>''||s[i]<'')return -;
for(int i=;i<len;i++)num=num*+s[i]-'';
return num;
}
int main(){
string sa,sb;
cin>>sa;
getchar();
getline(cin,sb);
int a=f(sa);
int b=f(sb);
if(a<=&&a>=&&(b<||b>))
cout<<a<<" + ? = ?";
else if(b<=&&b>=&&(a<||a>))
cout<<"? + "<<b<<" = ?";
else if(a<=&&a>=&&b<=&&b>=)
cout<<a<<" + "<<b<<" = "<<a+b<<endl;
else cout<<"? + ? = ?"<<endl;
return ;
}

L1-027 出租

注意 自定义的set这样写:set<int,greater<int> >st;

搞个vector就行了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e6+;
int main(){
string s;
cin>>s;
set<int,greater<int> >st;
int len=s.size();
for(int i=;i<len;i++){
st.insert(s[i]-'');
}
vector<int>arr;
set<int,greater<int> >::iterator it;
for(it=st.begin();it!=st.end();it++){
int x=*it;
arr.pb(x);
}
vector<int>index;
for(int i=;i<;i++){
for(int j=;j<arr.size();j++){
if(arr[j]==s[i]-'')index.pb(j);
}
}
cout<<"int[] arr = new int[]{";
for(int i=;i<arr.size();i++){
if(i)cout<<",";
cout<<arr[i];
}
cout<<"};"<<endl;
cout<<"int[] index = new int[]{";
for(int i=;i<index.size();i++){
if(i)cout<<",";
cout<<index[i];
}
cout<<"};"<<endl; return ;
}

L1-030 一帮一

就是vector  你不能这样读进来

错误写法:

rep(i,1,n)scanf("%d",&v[i]);

正确写法:

rep(i,1,n)scanf("%d",&x),v.pb(x);

不会用pair,只会结构,这题可能用pair更好做吧;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e5+;
struct node{int sex,vis;string name;};
struct ANS{string fi,se;};
int main(){
int n;
cin>>n;
vector<node>v;
rep(i,,n){
node tmp;
cin>>tmp.sex>>tmp.name;
tmp.vis=;
v.push_back(tmp);
}
vector<ANS>ans;
int len=v.size();
for(int i=;i<len;i++){
for(int j=len-;j>=;j--){
if(v[i].sex!=v[j].sex&&v[j].vis==&&v[i].vis==){
ANS tmp;
tmp.fi=v[i].name;
tmp.se=v[j].name;
ans.pb(tmp);
v[i].vis=,v[j].vis=;
}
}
}
len=ans.size();
for(int i=;i<len;i++)
cout<<ans[i].fi<<" "<<ans[i].se<<endl;
system("pause");
return ; }

L1-039 古风排版

这题挺有意思的;也不是很难;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e5+;
int main(){
int n,num;
cin>>n;
string s;
getchar();
getline(cin,s);
vector<char>v[];
int len=s.size();
for(int i=len-;i>=;i--){
if((i+)%n==)num=n;
else num=(i+)%n;
v[num].pb(s[i]);
}
// cout<<"test :"<<endl;
if(len%n==)num=n;
else num=len%n;
for(int i=;i<=n;i++){
if(i>num)cout<<" ";
for(int j=;j<v[i].size();j++){
cout<<v[i][j];
}
cout<<endl;
} return ;
}

L1-044 稳赢

注意取余这么写:cnt%(k+1)==0

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e5+;
int main(){
int k;
scanf("%d",&k);
string s;
int cnt=,flag;
while(cin>>s){
if(s[]=='E')break;
cnt++;
// cout<<"test "<<s<<" "<<cnt<<": "<<endl;
if(cnt%(k+)==)flag=;
else flag=;
if(flag)cout<<s<<endl;
else {
if(s[]=='C')cout<<"Bu"<<endl;
else if(s[]=='B')cout<<"JianDao"<<endl;
else if(s[]=='J')cout<<"ChuiZi"<<endl;
}
}
// system("pause");
return ;
}

L1-046 整除光棍

这题本来想暴力,但必然是妥妥的T了

然后考虑模拟手算的除法;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e5+;
int main(){
ll ans,x,s=,n=;
cin>>x;
while(s<x)s=s*+,n++;
while(){
cout<<s/x;
s%=x;
if(s==){
ans=s;
break;
}
s=s*+;
n++;
}
cout<<" "<<n<<endl;
// system("pause");
return ;
}

L1-054 福到了

这题推了好久,其实就一个东西,旋转180度的话,要交换的满足 x1+x2=n+1,y1+y2=n+1;

因为他们绕着中心旋转180;

也不用转换,直接判断输出就是了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e5+;
char mp[][];
int main(){
char c;
int n;
scanf("%c %d",&c,&n);
rep(i,,n){
getchar();
rep(j,,n){
scanf("%c",&mp[i][j]);
}
}
// cout<<"test :"<<endl;
// rep(i,1,n){
// rep(j,1,n){
// printf("%c",mp[i][j]);
// }
// cout<<endl;
// }
int cen=n+;
bool issame=;
rep(i,,n){
rep(j,,n){
int x=cen-i;
int y=cen-j;
if(mp[x][y]!=mp[i][j])issame=;
}
}
if(issame){
cout<<"bu yong dao le"<<endl;
rep(i,,n){
rep(j,,n){
if(mp[i][j]==' ')cout<<" ";
else cout<<c;
}
cout<<endl;
}
return ;
} rep(i,,n){
rep(j,,n){
int x=cen-i;
int y=cen-j;
if(mp[x][y]!=' ')printf("%c",c);
else printf(" ");
}
cout<<endl;
}
// shit: system("pause");
return ;
}

L1-043 阅览室 :

其实就是遍历,注意一下细节就行了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e3+;
struct book{bool flag;int time;};
int get(int h,int m){return h*+m;}
book a[maxn];
int main(){
rep(i,,maxn)a[i].flag=;
int num,h,m,n;
char op;
scanf("%d",&n);
while(n--){ int cnt=,time=;
while(){
scanf("%d %c %d:%d",&num,&op,&h,&m);
if(num==)break;
if(op=='S'){
a[num].flag=,a[num].time=get(h,m);
}
else if(a[num].flag==){
time+=get(h,m)-a[num].time;
a[num].flag=;
cnt++;
}
}
if(cnt==&&time==)cout<<"0 0"<<endl;
else printf("%d %.0lf\n",cnt,time*1.0/cnt);
}
// system("pause");
return ;
}

L1-049 天梯赛座位分配

挺有意思的,注意格式输出,然后就是用一个nun记录已经安排满的队伍,如果没满就一直放,再记个pos表示位置,就行了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e3+;
int team[maxn];
vector<int>ans[maxn];
int main(){ int n,sum=;
scanf("%d",&n);
rep(i,,n){
scanf("%d",&team[i]);
team[i]*=;
} int pos=,num=;
while(num<n){ for(int i=;i<=n;i++){
if(team[i]!=){
team[i]--,ans[i].pb(pos);
if(num==n-)pos+=;
else pos++;
if(team[i]==)num++;
} } }
rep(i,,n){
printf("#%d\n",i);
for(int j=;j<ans[i].size();j++){
printf("%d%c",ans[i][j],(j+)%==?'\n':' ');
}
}
// system("pause");
return ;
}

L1-059 敲笨钟

做法:暴力枚举一下,然后注意读掉回车;

#include<bits/stdc++.h>
using namespace std;
#define per(i,j,k) for(int i=k;i>=j;i--)
int main(){
int n;
cin>>n;
string s;
getchar();
while(n--){
getline(cin,s);
int flag1=,flag2=;
int len=s.size();
for(int i=;i<len;i++){
if(s[i]==','){
if(s[i-]=='g'&&s[i-]=='n'&&s[i-]=='o')flag1=;
} if(s[i]=='.'){
if(s[i-]=='g'&&s[i-]=='n'&&s[i-]=='o')flag2=;
} }
if(flag1&&flag2){
int cnt=,seat;
for(int i=len-;i>=;i--){
if(s[i]==' ')cnt++;
if(cnt>=){
seat=i;
break;
}
}
for(int i=;i<=seat;i++)printf("%c",s[i]);
cout<<"qiao ben zhong."<<endl; } else cout<<"Skipped"<<endl; } return ;
}

L1-064 估值一亿的AI核心代码

这题挺有意思的;

解法:如果给你一个字符串,单纯让你替换单词,频繁用string的搜索是很麻烦的,参考了大神的做法;

就是搞个vector<string>v ; 这样你每次截取单词,空格,和标点符号就很方便,然后按题目意思模拟即可;

PS:有个函数 isalnum 就是判断是否为数字或者字母;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-;
const ll MOD=1e9+;
const int maxn=1e3+;
int main(){
int n;
cin>>n;
getchar();
while(n--){
string s;
vector<string>v;
getline(cin,s);
cout<<s<<endl<<"AI: ";
int len=s.size();
for(int i=;i<len;i++){
if(s[i]=='?')s[i]='!';
else if(isupper(s[i])&&s[i]!='I')s[i]=tolower(s[i]);
}
for(int i=;i<len; ){
string tmp="";
if(isalpha(s[i])){
while(isalpha(s[i])&&i<len)tmp+=s[i++];
}
else if(isdigit(s[i])){
while(isdigit(s[i])&&i<len)tmp+=s[i++];
}
else if(s[i]==' '){
tmp=" ";
while(s[i]==' ')i++;
} else {
tmp+=s[i++];
if(!v.empty()&&v.back()==" ")v.pop_back();
}
if(tmp==" "&&(v.empty()||i==len))continue;
v.pb(tmp);
} for(int i=;i<v.size();i++){
if(v[i]=="I"||v[i]=="me")v[i]="you";
else if(v[i]=="you"){
if(i<||!(v[i-].size()==&&!isalnum(v[i-][])))continue;
if(v[i-]=="can")v[i-]="I",v[i]="can";
if(v[i-]=="could")v[i-]="I",v[i]="could";
}
}
for(int i=;i<v.size();i++)cout<<v[i];
cout<<endl;
}
system("pause");
return ;
}

未完待续;

PTA 天梯赛 L1的相关教程结束。

《PTA 天梯赛 L1.doc》

下载本文的Word格式文档,以方便收藏与打印。