【决赛】2019年全国高校计算机能力挑战赛决赛C++组题解
2019年12月1日09:58:59
决赛题目为6道编程题,题目不是很难。但是不能OJ,感觉要凉凉,因为我自己只会单纯的过测试样例。
1. 自动编码。给一个字符串,里面含有数字字符,将数字加3后模10的结果放在原位上。即’1’变成’4’,’2’变成’5’,’9’变成’2’,请输出变换后的字符串。
输入说明:一个字符串(长度小于255)。
输出说明:按照题目规则变换后得到的字符序列。
输入样例:2012-09-05A
输出样例:5345-32-38A
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
using namespace std;
int main(){
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
s[i]=((s[i]-'0'+3)%10+'0');
}
}
cout<<s;
return 0;
}
2. 求各种三维物体的体积,输入图形类型,之后是参数表,请计算它们的体积,按体积从大到小排序,输出这些体积的值。输入图形类型包括长方体Cu、球体Sp和圆柱体Cy。
输入说明:第一行是一个正整数N(0输出说明:从大到小排序后的体积,精度保留小数点后2位。
输入样例:3
Cu 3 4 5
Sp 3
Cy 3 6
输出样例:169.56 113.04 60.00
说明:π取值3.14
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
string s;
vector<float>v;
char ch;
while(cin>>s){
float sum=0;
if(s=="Cu"){
int a,b,c;
cin>>a>>b>>c;
sum=a*b*c;
v.push_back(sum);
}
else if(s=="Sp"){
int a;
cin>>a;
sum=3.14*a*a*a*4/3;
v.push_back(sum);
}else if(s=="Cy"){
int a,b;
cin>>a>>b;
sum=3.14*a*a*b;
v.push_back(sum);
}
}
sort(v.begin(),v.end());
int flag=0;
for(int i=0;i<v.size();i++){
if(flag)printf(" ");
flag=1;
printf("%.2f",v[v.size()-i-1]);
}
return 0;
}
3. 对给定的整数数组(数组长度N满足1〈N〈10000),选择一个位置,把数组分割为前后两个部分。求使得前后两个部分所有元素和的差值绝对值最大的分割位置(即使得分割后前后两部分数据的和尽可能悬殊)。如有多种分割情况,选择分割位置最小的情况输出。
输入说明:第一行是整数N,说明数组中元素个数,接下来一行是这N个数。
输出说明:一个整数,即前面部分包含的元素个数。
输入样例:6
11 102 13 24 35 46
输出样例:1
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
vector<int>num(n);
int sum=0;
for(int i=0;i<n;i++){
cin>>num[i];
sum+=num[i];
}int sum2=0;
int id=0;
int maxsum=0;
for(int i=0;i<n;i++){
sum2+=num[i];
if(abs(sum2-sum)>maxsum){
id=i;
maxsum=abs(sum2-sum);
}
}
cout<<id+1;
return 0;
}
4. 铁艺加工厂有部分钢板加工余料,这些余料外观顶部呈现为阶梯方波状,如图1所示,请求出可切割出最大长方形铁皮的面积。图1左图黄色部分为最大可裁剪的长方形铁皮,右图蓝色部分为最大可裁剪的长方形铁皮。
输入说明:第一行是正整数N(0〈N〈100000),表示余料中的矩形个数。接下来是N行,每行给出每个矩形的宽和高。
输出说明:可以裁剪出的最大矩形面积,面积保留小数点后一位。
输入样例:5
5 3
2 2.5
5 3
3 4
6 4
输出样例:52.5
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
#include<vector>
using namespace std;
struct ju{
float a;
float b;
};
int main(){
float max=0;
int n;
cin>>n;
vector<ju> ju(n);
for(int i=0;i<n;i++){
float a;
float b;
cin>>a>>b;
ju[i].a=a;
ju[i].b=b;
}
for(int i=0;i<n;i++){
float len=0;
float high=ju[i].b;
for(int l=i;l<n;l++){
len+=ju[l].a;
if(high>ju[l].b){
high=ju[l].b;
}
float sum=len*high;
if(sum>max){
max=sum;
}
//cout<<sum<<" "<<len<<" "<<high<<endl;
}
}
printf("%.1f",max);
return 0;
}
5. 村村通:求解2个村庄之间的修路最低成本。输入包括两两村庄之间道路的建设成本。计算修筑给定两个村庄之间道路的最小建设成本,如果两村之间通过已知数据发现不能构成联通,输出-1。
输入说明:第一行是3个整数,分别表示村庄的数目N(村庄编号1~N,0〈N〈10000)和待求解的两个村庄的编号,之后是多行道路修筑成本信息,每行有3个整数,分别表示两个村庄的编号和修筑这两个村庄之间道路的建设成本,以-1 -1 -1结束。
输出说明:修筑指定村落间道路的最小建设成本。
输入样例:5 1 3
1 2 11
1 4 12
2 3 8
3 4 5
4 5 8
-1 -1 -1
输出样例:17
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,a,b;
cin>>n>>a>>b;
vector<vector<int>>v;
for(int i=0;i<n+1;i++){
vector<int >vv(n+1,99999);
v.push_back(vv);
}
while(1){
int na,nb,nn;
cin>>na>>nb>>nn;
if(na==-1&&nb==-1&&nn==-1){
break;
}
v[na][nb]=nn;
v[nb][na]=nn;
}
for(int i=1;i<=n;i++){
if (v[a][i]!=99999){
for(int l=1;l<=n;l++){
if(v[a][l]>(v[i][l]+v[a][i])){
v[a][l]=v[i][l]+v[a][i];
}
}
}
}
cout<<v[a][b];
return 0;
}
6. 工地上需要顺序采购N批材料,所需费用依次为F1, F2, …, Fn,因施工关系,采购顺序不能改变,需要在连续的K个月内采购完成。财务希望支出尽可能平稳,即这K个月的采购支出的最大值最小,例如需要分2个月依次采购3批材料,所需费用依次是5、3、7。一种方案是先采购5,然后采购3和7,最大支出为10;另一方案是先采购5和3,再采购7,最大支出为8,比前一种采购方式平稳,采购支出的最大值最小是8。
输入说明:第一行是两个正整数,分别是采购批数N(0〈N〈10000)和采购月数K(0〈K〈=N〈10000)。第二行是N个正整数,对应N批材料的费用F1, F2, …, Fn。
输出说明:所有采购方案中,支出最大值最小的值。
输入样例:3 2
5 3 7
输出样例:8
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于64MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
vector<int>v(a);
vector<int>mou(b);
for(int i=0;i<a;i++){
cin>>v[i];
}
sort(v.begin(),v.end());
for(int i=0;i<a;i++){
sort(mou.begin(),mou.end());
mou[0]+=v[a-i-1];
}
sort(mou.begin(),mou.end());
cout<<mou[b-1];
return 0;
}