PTA天梯赛L1 041-050题目解析
目录
1.L1-041 寻找250
2.L1-042 日期格式化
3.L1-043 阅览室
4.L1-044 稳赢
5.L1-045 宇宙无敌大招呼
6.L1-046 整除光棍
7.L1-047 装睡
8.L1-048 矩阵A乘以B
9.L1-049 天梯赛座位分配
10.L1-050 倒数第N个字符串
1.L1-041 寻找250
#include<iostream>using namespace std;int coun=0;
int nums;
signed main(){while(cin>>nums){coun++;if (nums==250) {cout<<coun;break;}}return 0;
}
2.L1-042 日期格式化
#include<iostream>
#include<cstdio>
using namespace std;
// mm-dd-yyyy => yyyy-mm-ddint year,mouth,day;signed main(){scanf("%d-%d-%d",&mouth,&day,&year);printf("%04d-%02d-%02d",year,mouth,day);return 0;
}
3.L1-043 阅览室
分析:
注意理解题目给出的示例,这里的“即只有S
没有E
,或者只有E
没有S
的纪录,系统应能自动忽略这种无效纪录。”实际含义是:
当同一本书,多次借,一次还时,应该按最后一次借书算。
一次借,多次还时,按第一次还算。
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;int n;int num,hour,minute;
char op;int sum=0,sumTotal=0;struct sss{int SHour;int SMinute;bool check;
};inline int calc(int hour1,int minute1,int hour2,int minute2){return hour2*60+minute2-(hour1*60+minute1);
}
// 真他妈傻鸟
// 当同一本书,多次借,一次还时,应该按最后一次借书算。
// 借书
void borrowBook(struct sss* ttt,int num,int hour,int minute){
// if (ttt[num].check==true) return;ttt[num].SHour=hour;ttt[num].SMinute=minute;ttt[num].check=true;
}
// 一次借,多次还时,按第一次还算。
// 还书
void returnBook(struct sss* ttt,int num,int hour,int minute){if (ttt[num].check!=true) return ;// 注意 一天可能被借出多次 sum+=calc(ttt[num].SHour,ttt[num].SMinute,hour,minute);ttt[num].check=false;sumTotal++;
}void settlement(){if (sumTotal==0) cout<<sumTotal<<" "<<sum<<endl;else cout<<sumTotal<<" "<<fixed<<setprecision(0)<<1.0*sum/sumTotal<<endl;
// if (sum==0) printf("%d %.0lf\n",sumTotal,0);
// else printf("%d %.0lf\n",sumTotal,1.0*sum/sumTotal);
}signed main(){cin>>n;for(int i=0;i<n;i++){struct sss ttt[1010];sum=0;sumTotal=0;while(1){scanf("%d %c %d:%d",&num,&op,&hour,&minute);if (num==0){settlement();break;}if (op=='S'){borrowBook(ttt,num, hour, minute);}else if (op=='E'){returnBook(ttt,num, hour, minute);}}}return 0;
} // 一次借,多次还时,按第一次还算。
/*1
1 S 00:00
1 E 01:59
1 E 02:00
0 S 03:00*/
// => 1 119/*1
1 S 00:00
1 S 10:00
2 S 11:00
1 E 11:00
1 S 12:00
1 S 13:00
1 E 14:00
0 S 15:00=> 2 60
*/
4.L1-044 稳赢
#include<iostream>
#include<map>
using namespace std;int k,coun;
string s;map<string,string> mymap;
// ChuiZi Bu JianDao
void init(){mymap["ChuiZi"]="Bu";mymap["Bu"]="JianDao";mymap["JianDao"]="ChuiZi";
}
signed main(){cin>>k;init();while(1){cin>>s;if (s=="End") break;if (coun==k){cout<<s<<endl;coun=0;}else {cout<<mymap[s]<<endl;coun++; }}return 0;
}
5.L1-045 宇宙无敌大招呼
#include<iostream>using namespace std;string s;
signed main(){cin>>s;cout<<"Hello "<<s<<endl;return 0;
}
6.L1-046 整除光棍
分析:
如果有,num=q⋅x+r,那么(num⋅10+1)% x = (r⋅10+1)modx
所以只需要保存每一步的余数,然后将余数r*10 + 1获得最终余数就可以得到需要多少位光棍了
#include<iostream>
#include<vector>
using namespace std;
int x,num=1;
int coun=1;
int addCount=0;
vector<int> res;
inline void addNum(int& num){coun++;num= num*10+1;
// cout<<"当前num"<<num<<endl;
}inline void print(){int i;
// for (i=0;;i++){
// if (res[i]==0) continue;
// else break;
// }for( i=0;i<res.size();i++){cout<<res[i];}cout<<" ";
}
signed main(){cin>>x;while(num<x){addNum(num); }while(1){if (num%x==0) {// 这里之前直接push 0了 笨死了 res.push_back(num/x);break;}res.push_back(num/x);num%=x;addNum(num);}print();cout<<coun<<endl;return 0;}
7.L1-047 装睡
#include<iostream>using namespace std;int n;string name;
int a,b;bool check(int& a,int& b){if (15<=a && a<=20 && 50<=b && b<=70) return true;return false;
}
signed main(){cin>>n;for(int i=0;i<n;i++){cin>>name>>a>>b;if (!check(a,b)){cout<<name<<endl;}} return 0;
}
8.L1-048 矩阵A乘以B
#include<iostream>using namespace std;int lena1,lena2;
int lenb1,lenb2;int size1,size2;
//template<int n,int m>
//void printMatrix(int (&arr1)[n][m],int (&arr2)[n][m]){
//
//}const int MAX=110;
int arr1[MAX][MAX];
int arr2[MAX][MAX];int res[MAX][MAX];inline int calc(int (&arr1)[MAX][MAX],int len1,int (&arr2)[MAX][MAX],int len2,int size){int res=0;for(int j=1;j<=size;j++){res+=arr1[len1][j]*arr2[j][len2];}return res;
}
void printMatrix(int (&arr1)[MAX][MAX],int lena1,int (&arr2)[MAX][MAX],int lena2,int size){for(int i=1;i<=lena1;i++){for(int j=1;j<=lenb2;j++){res[i][j] = calc(arr1,i,arr2,j,size);if (j-1) cout<<" ";cout<<res[i][j];}cout<<endl;}}
signed main()
{cin>>lena1>>lena2;for(int i=1;i<=lena1;i++){for(int j=1;j<=lena2;j++){cin>>arr1[i][j];}}cin>>lenb1>>lenb2; for(int i=1;i<=lenb1;i++){for(int j=1;j<=lenb2;j++){cin>>arr2[i][j];}}if (lena2!=lenb1){cout<<"Error: "<<lena2<<" != "<<lenb1<<endl;}else {cout<<lena1<<" "<<lenb2<<endl;printMatrix(arr1,lena1,arr2,lenb2,lena2);}return 0;}
9.L1-049 天梯赛座位分配
分析:
使用二维vector my_vec来保存每位队员,然后根据座位号二维vector res分配到对应的数组,根据最大长度进行索引,中间如果检测到分配到的序号是连续的,则+1保持间隔。最后注意条件,合理打印格式。
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector> using namespace std;int school_num;
vector<vector<int> > my_vec,res;
vector<int> size_vec;
int num;int site_num =1;// 座位编号 从1开始
signed main(){cin>>school_num;for(int i=0;i<school_num;i++) {cin>>num;my_vec.push_back(vector<int>(num*10,0));res.push_back(vector<int>(0,0));}
// cout<<"DEBUG1"<<endl; for(auto it:my_vec) size_vec.push_back(it.size());int max_len = *max_element(size_vec.begin(),size_vec.end());int current_index = 0; // 循环变量// cout<<"DEBUG2"<<endl;for(current_index = 0; current_index<max_len; current_index++) {
// cout<<"LOOP1"<<endl;for(int i=0;i<my_vec.size();i++) {
// cout<<"LOOP2"<<endl;if (my_vec[i].size() > current_index) {// 如果是紧接着分配了,需要隔一个位置 注意:vector为空时不能使用back操作 if (!res[i].empty() && res[i].back() + 1 == site_num) site_num++;// 给这些队伍分配座位 res[i].push_back(site_num);site_num++;} }}
// cout<<"DEBUG3"<<endl;for(int i=0;i<res.size();i++) {cout<<"#"<<i+1<<endl;for(int j=0;j<res[i].size();j++) {if (j%10 && j%10 != 0) cout<<" ";cout<<res[i][j];if ((j+1)%10 == 0) cout<<endl;}
// cout<<endl;}
// cout<<"DEBUG4"<<endl;return 0;
}
10.L1-050 倒数第N个字符串
#include <bits/stdc++.h>using namespace std;typedef long long int ll;int a[1000010];
int main() {ll n,nums;cin>>n>>nums;nums=pow(26,n)-nums;for(int i=0;i<nums;i++){a[i]=nums%26;nums/=26;}for(int i=n-1;i>=0;i--) cout<<(char)('a'+a[i]);// cout<<str<<endl;return 0;
}