PTA天梯赛L1 091-100题目解析
目录
1.L1-091 程序员买包子
2.L1-092 进化论
3.L1-093 猜帽子游戏
4.L1-094 剪切粘贴
5.L1-095 分寝室
6.L1-096 谁管谁叫爹
7.L1-097 编程解决一切
8.L1-098 再进去几个人
9.L1-099 帮助色盲
10.L1-100 四项全能
1.L1-091 程序员买包子
#include<iostream>using namespace std;int n,m,k;
string x;
signed main(){cin>>n>>x>>m>>k;if (k==n) cout<<"mei you mai "<<x<<" de";else if (k==m) cout<<"kan dao le mai "<<x<<" de";else cout<<"wang le zhao mai "<<x<<" de"; return 0;
}
2.L1-092 进化论
#include<iostream>using namespace std;int n;int a,b,c;
signed main(){cin>>n;for(int i=0;i<n;i++){cin>>a>>b>>c;if (a*b==c ){cout<<"Lv Yan"<<endl;}else if (a+b==c){cout<<"Tu Dou"<<endl;}else if (a*b!=c && a+b!=c){cout<<"zhe du shi sha ya!"<<endl;}}return 0;
}
3.L1-093 猜帽子游戏
#include<iostream>using namespace std;int n,k;
int arr[110];int res[110];// 对arr 和 res的前n个结果进行判断
//每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。
//用数字 1 表示黑色、2 表示黄色之外,0 表示这个宝宝弃权不猜。
bool check(int n){bool errors=false,bingo=false;for(int i=1;i<=n;i++){if (res[i]==0) continue;if (res[i]==arr[i]) bingo=true;else errors=true;}if (bingo && !errors) return true;return false;
}
signed main(){cin>>n;for(int i=1;i<=n;i++){cin>>arr[i]; }cin>>k;for(int i=0;i<k;i++){for(int j=1;j<=n;j++){cin>>res[j];}if (check(n)){cout<<"Da Jiang!!!"<<endl;}else {cout<<"Ai Ya"<<endl;}}return 0;
}
4.L1-094 剪切粘贴
解析:
注意string相关的API及其边界即可。
#include<iostream>
#include<string>
using namespace std;string inits;
int n;string a,b;
int starts,overs;signed main(){cin>>inits;cin>>n;for(int i=0;i<n;i++){cin>>starts>>overs>>a>>b;string cut=inits.substr(starts-1,overs-starts+1);string findStr=a+b;// 切掉 inits.erase(starts-1,overs-starts+1);// 插入int pos=inits.find(findStr);if (pos != string::npos){// 也可以找到第一个b所在的index进行插入inits.insert(pos+a.size(),cut);} else {inits+=cut;}} cout<<inits<<endl;return 0;
}
5.L1-095 分寝室
解析:
将男女每个寝室分配人数,在2-Nx之间进行枚举即可,然后得到人数差最小的方案
题目奇怪的是10^5数据范围的情况下,n^2算法不会超时,应该数据范围太弱了
#include<iostream>
#include<algorithm>
using namespace std;#define debug(x) cout<<"变量"<<#x<<"的值是"<<x<<endl;int n0,n1,n;int res=1e5+10;bool flag=false;
int value=-1;
signed main(){cin>>n0>>n1>>n;for(int i=2;i<=n0;i++){if(n0%i==0){for(int j=2;j<=n1;j++){if (n1%j==0 && n0/i+n1/j==n && abs(i-j)<res){res=abs(i-j);value=i;flag=true;break;}}}}if (flag){cout<<n0/value<<" "<<n-n0/value<<endl;}else {cout<<"No Solution"<<endl;}return 0;
}
6.L1-096 谁管谁叫爹
#include<iostream>using namespace std;//#define int long long
int n;
int a,b;inline int calcOne(int num){int sum=0;while(num){sum+=num%10;num/=10; }return sum;
}
signed main(){cin>>n;for(int i=0;i<n;i++){cin>>a>>b;int sa,sb;sa=calcOne(a);sb=calcOne(b);if (a%sb==0 && b%sa!=0){cout<<"A"<<endl;}else if (a%sb!=0 && b%sa==0){cout<<"B"<<endl;}else {if (a>b) cout<<"A"<<endl;else cout<<"B"<<endl;}} return 0;
}
7.L1-097 编程解决一切
#include<iostream>
#include<iomanip>
#include<vector>
#include<cmath>
#include<utility>
#include<algorithm>//#include<sstream>
//#include<cctype>using namespace std;signed main(){cout<<"Problem? The Solution: Programming."; return 0;
}
8.L1-098 再进去几个人
#include<iostream>
#include<iomanip>
#include<vector>
#include<cmath>
#include<utility>
#include<algorithm>//#include<sstream>
//#include<cctype>using namespace std;int a,b;signed main(){cin>>a>>b;cout<<b-a;return 0;
}
9.L1-099 帮助色盲
解析:
这道题很恶心的是,题目描述很垃圾
其一、对于输入数据描述不一致。前面提到“前方两米内有人”,后面又是“前方两米内是否有同向行走的人”,实际上这两个表述的都是后者的意思。
其二、对于部分情况不交代。比如在黄灯时,提示音不工作,但是色盲怎么执行策略,这个逻辑没有提出。应该是按照生活常识,经历“绿灯-黄灯-红灯-绿灯”的过渡,默认黄灯也要停止。所以在非绿灯时,行人都应该停止前进。(哪怕是在红灯时,有同向行人闯红灯,也要停下来)
感觉命题组出题审查不够全面,每年L1系列都会出一道含义模糊的题面,不知道是故意的还是确实语文水平有待提高。
#include<iostream>
#include<iomanip>
#include<vector>
#include<cmath>
#include<utility>
#include<algorithm>//#include<sstream>
//#include<cctype>using namespace std;int laten_color; // 0 表示红灯、1 表示绿灯、2 表示黄灯
int status; // 取值为 0 表示前方两米内没有同向行走的人、1 表示有。signed main(){cin>>laten_color>>status;// 当前交通灯为红灯或绿灯时if (laten_color == 0 || laten_color == 1) {// 有同向行走的人,则患者自己可以判断不提示 if(status) cout<<"-"<<endl<<( laten_color == 1 ? "move":"stop")<<endl;else {if (laten_color) cout<<"dudu"<<endl<<"move"<<endl;else cout<<"biii"<<endl<<"stop"<<endl;}// 黄灯必须停止,这里题目没说明 } else cout<<"-"<<endl<<"stop"<<endl;return 0;
}
10.L1-100 四项全能
#include<iostream>
#include<iomanip>
#include<vector>
#include<cmath>
#include<utility>
#include<algorithm>//#include<sstream>
//#include<cctype>using namespace std;int n,m,tmp,sum = 0;
vector<int> person_num;signed main(){cin>>n>>m;for(int i=0;i<m;i++) {cin>>tmp;sum +=tmp;}int k = sum / n; // 最大值为mif (k>= m-1) {cout<<sum - n*(m-1)<<endl;} else cout<<0;return 0;
}