202401卓裂学院转专业-上机测试
7-1 一起生日
作者 刘春英 单位 杭州电子科技大学
杭州电子科技大学附属小学有个优秀的传统,每隔一段时间,会给班里的近期过生日的同学举办一场生日 Party!老师会给出一个生日起止日期来确定生日 Party 的小寿星。
输入格式:
输入包含多组测试数据。
每组数据第一行,包括一个正整数 \(N(0 <= N <= 40)\),表示某个班的学生人数,接下来有 \(N\) 行数据,每行包含一个同学的姓名,以及出生年、月、日。
每组数据的最后一行,包括 \(4\) 个正整数 \(m1、d1、m2、d2\),分别表示生日 Party 的小寿星生日起止月和日(包含),其中 \(m1 <= m2\)。
输出格式:
每组数据输出一行小寿星的名单(按照原名单的次序),每个名字后面跟一个空格。
输入样例:
5
Tom 2009 10 15
Kate 2010 7 20
David 2010 6 30
Kevin 2009 7 3
Sarah 2010 3 8
7 1 7 30
输出样例:
Kate Kevin
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<bits/stdc++.h>
using namespace std;
struct stu{
string name;
int m;
int d;
};
int main(){
int n;
while(cin>>n){
int temp;
stu s[n];
for(int i=0;i<n;i++){
cin>>s[i].name>>temp>>s[i].m>>s[i].d;
}
int m1,m2,d1,d2;
cin>>m1>>d1>>m2>>d2;
vector<string> v;
if(m1==m2){
for(auto &i:s){
if(i.m==m1 && i.d>=d1 && i.d<=d2){
v.push_back(i.name);
}
}
}else{
for(auto &i:s){
if(i.m>m1 && i.m<m2){
v.push_back(i.name);
}else if(i.m==m1 && i.d>=d1){
v.push_back(i.name);
}else if(i.m==m2 && i.d<=d2){
v.push_back(i.name);
}
}
}
for(auto &i:v){
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}
7-2 素数输出
作者 刘春英 单位 杭州电子科技大学
给定一个正整数 \(N\),请输出小于等于 \(N\) 的素数个数。
输入格式:
输入包含多组测试数据,每组数据占一行,包括一个正整数 \(N(2<=N<=100000)\)。
输出格式:
对于每组数据给定的 \(N\),请输出一个正整数,表示小于等于 \(N\) 的素数个数,每组输出占一行。
输入样例:
10
20
输出样例:
4
8
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
if(n<=1) return false;
if(n==2) return true;
if(n%2==0) return false;
for(int i=3;i<sqrt(n)+1;i++){
if(n%i==0) return false;
}
return true;
}
int main(){
int n;
int count=0;
while(cin>>n){
count=0;
for(int i=2;i<=n;i++){
if(isprime(i)){
count++;
}
}
cout<<count<<endl;
}
return 0;
}
7-3 多级排序
作者 刘春英 单位 杭州电子科技大学
说到排序,我们都知道这是编程人员必备的知识,更不用说信奥了。
朱逸天,丁爸编程培训班的首期学员,尽管0基础开始,但是进步很大,已经熟练掌握了各种排序的实现。
现在,朱逸天专门准备了这么一个题目,想测试一下同班同学的你,看看你是否也熟练掌握了排序。
假设丁爸信奥培训班共有 \(N(N<100)\) 名同学,已知各位同学的详细信息(姓名,年龄,分数),现在请对培训班的全体同学做一个排序。
排序的规则要求如下:
首先按照分数从高到低进行排序;
如果分数相同,则年龄小的排名靠前;
如果依然不能区分,再按照姓名的字典序排列;
考验你的时候到了,你是否能像朱逸天一样熟练掌握排序呢?
输入格式:
输入包含多组测试用例;
每组数据首先是一个正整数N,表示培训班有N位同学,每位同学的信息占一行,依次是姓名Name、年龄Age和分数Score。
其中,姓名Name是长度不超过10的无空格字符串,年龄Age是不大于\(20\)的正整数,分数Score是不超过\(100\)的浮点数。
输出格式:
请输出排序后的全班同学信息,其中,分数保留\(2\)位小数。
格式参见样例。
输入样例:
6
jaa 18 99.5
bbb 19 100
kcc 19 99
tdd 20 100
abc 18 100
see 19 100
输出样例:
abc 18 100.00
bbb 19 100.00
see 19 100.00
tdd 20 100.00
jaa 18 99.50
kcc 19 99.00
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<bits/stdc++.h>
using namespace std;
struct stu{
string name;
int age;
double score;
};
bool cmp(stu& a,stu& b){
if(abs(a.score-b.score)<=1e-6){
if(a.age==b.age){
return a.name<b.name;
}
return a.age<b.age;
}
return a.score>b.score;
}
int main(){
int n;
while(cin>>n){
vector<stu> v(n);
for(int i=0;i<n;i++){
cin>>v[i].name>>v[i].age>>v[i].score;
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<n;i++){
cout<<v[i].name;
printf(" %d %.2lf",v[i].age,v[i].score);
cout<<endl;
}
}
return 0;
}
7-4 超级密码
作者 刘春英 单位 杭州电子科技大学
上次设计的“高级密码”被你们破解了,一丁小朋友很不服气!
现在,他又设计了一套更加复杂的密码,称之为“超级密码”。
说实话,这套所谓的“超级密码”其实也并不难:
对于一个给定的字符串,你只要提取其中的数字,然后连在一起构成一个整数,再乘以刘一丁小朋友的幸运数字513,就是解密后的结果了~
比如,字符串“ads2d4,122”,提取后的整数是24122,然后乘以513,就能得到解密后的结果:12374586。
注:题目保证解密后的结果在32位无符号整数范围。
输入格式:
输入首先包括一个正整数\(N\),表示有N组测试用例。
每组数据占一行,包含一个长度不超过\(30\)的字符串。
输出格式:
请根据题目要求输出解密后的结果,每组数据输出一行。
输入样例:
2
ads2d4,122
0023asdf2AA90
输出样例:
12374586
11947770
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
getchar();
while(n--){
unsigned long long res=0;
char c;
c=getchar();
while(c!='\n' && c!=EOF){
if(c>='0' && c<='9'){
res*=10;
res+=c-'0';
}
c=getchar();
}
res*=513;
cout<<res<<endl;
}
return 0;
}
7-5 别踩白块
作者 刘春英 单位 杭州电子科技大学
有一个铺满了矩形地砖的房间,地砖有黑色和白色两种。你现在站在一块黑色的地砖上面,从这块地砖开始,每次你可以选择向相邻的四块地砖走一步,但是只能走到黑色地砖上面,不能走到白色的地砖上面。
请计算按照上面给出的规则,你能到达的黑色地砖数量是多少。
输入格式:
输入包含多个测试数据。
每个测试用例包含多行,
第一行包含两个整数 \(M, N(1 <= N, M <= 20)\),分别表示房间的长和宽。
接下来有 \(N\) 行,每行包含 \(M\) 个字符,每个字符代表地砖的颜色。
'.' 代表黑色的地砖
'#' 代表白色的地砖
'@' 代表你的起始位置(只会出现一次)
当 \(M\) 和 \(N\) 都为 \(0\) 时,表示输入结束。
输出格式:
对于每组测试数据,请输出你能到达的黑色地砖数量(包含起始的黑色地砖)。
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
输出样例:
45
59
6
13
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<iostream>
#include<vector>
using namespace std;
int n,m,count;
int map[20][20];
int d1[4]={0,0,1,-1};
int d2[4]={1,-1,0,0};
void bfs(int x,int y){
for(int i=0;i<4;i++){
if(x+d1[i]<n && x+d1[i]>=0 && y+d2[i]<m && y+d2[i]>=0 && map[x+d1[i]][y+d2[i]]==1){
count++;
map[x+d1[i]][y+d2[i]]=0;
bfs(x+d1[i],y+d2[i]);
}
}
}
int main(){
while(scanf("%d %d",&m,&n)){
if(m==0 && n==0){
break;
}
char c;
int x,y;
count=1;
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
c=getchar();
if(c=='.'){
map[i][j]=1;
}else if(c=='#'){
map[i][j]=0;
}else if(c=='@'){
x=i;
y=j;
map[i][j]=0;
}
}
getchar();
}
bfs(x,y);
cout<<count<<endl;
}
return 0;
}
7-6 机器分配
作者 刘春英 单位 杭州电子科技大学
某总公司拥有设备\(M\)台,准备分给下属的\(N\)个子公司。各子公司若获得这些设备,可以为总公司赚取一定的盈利。
如何分配这\(M\)台设备才能使总公司得到的盈利最大?
请输出最大盈利值。
输入格式:
输入包含多组测试数据。
每组数据第一行为两个整数\(N\),\(M\),表示有\(N\)个子公司,M台设备。
接下来是一个\(N×M\)的矩阵,其中矩阵的第\(i\)行的第\(j\)列的数\(Aij\)表明第\(i\)个子公司分配\(j\)台机器的盈利。
其中:\(N <= 100, M <= 100\)
输出格式:
请计算总公司合理分配这\(M\)台设备所获得的最大盈利。
每组数据输出一行。
输入样例:
2 3
1 2 3
2 3 4
输出样例:
4
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m){
vector<vector<int>> v(n);
vector<int> res(m+1);
for(int i=0;i<n;i++){
v[i].emplace_back();
v[i].back()=0;
for(int j=0;j<m;j++){
v[i].emplace_back();
cin>>v[i].back();
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// cout<<" "<<v[i][j];
// }
// cout<<endl;
// }
res=v[0];
vector<int> temp(m+1);
for(int i=1;i<n;i++){
temp[0]=0;
for(int j=1;j<=m;j++){
int max=0;
for(int k=0;k<=j;k++){
if(res[k]+v[i][j-k]>max){
max=res[k]+v[i][j-k];
}
}
temp[j]=max;
}
res=temp;
}
cout<<res.back()<<endl;
}
return 0;
}