新人考试(100分)
有10道2分题,10道4分题,5道8分题,满分100分,答对得分,答错不得分,累计错三道则停止作答结算分数
输入n分
输出作答情况的数量m
#include<bits/stdc++.h>
using namespace std;
// we have defined the necessary header files here for this problem.
// If additional header files are needed in your program, please import here.
int timu[]={2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,8,8,8,8,8};
int tag[25]={};
int times=0;
int sum=0;
int score;
void dfs(int n,int now){
if(now<score){
dfs(n+1,now+timu[n]);
if(times<2){
times++;
dfs(n+1,now);
times--;
}
}
else if(now==score)sum++;
else return;
}
int main()
{
cin>>score;
// please define the C++ input here. For example: int a,b; cin>>a>>b;;
// please finish the function body here.
// please define the C++ output here. For example:cout<<____<<endl;
dfs(0,0);
cout<<sum;
return 0;
}
子树替换(200分)
第一行以数组的形式输入一个层次遍历的树,无子节点则以0标识;
第二行输入从根节点到所替换节点的路径;
第三行输入要替换的子树Q,输入方式同第一行;
如图示则输入[1,2,3,0,5,0,4]
锁定4号结点,则输入路径为\1\3\4
实际例题中节点上的序号可能重复,但路径保证唯一
替换子树要求:替换节点的所有子节点清空;子树Q完全存在于得到的新树;原来的树中与替换节点无关的节点完全保留
例如用树6->7,8(6是根节点,7、8分别为左右子节点)替换\1\3,则得到的新树应为[1,2,6,0,5,7,8]
最终输出是不输出空节点,即最终输出[1,2,6,5,7,8]
#include<bits/stdc++.h>
using namespace std;
// we have defined the necessary header files here for this problem.
// If additional header files are needed in your program, please import here.
vector<int> origin,dir,sub;
void clear(int node){
if(node<=origin.size())origin[node-1]=0;
else return;
clear(node*2);
clear(node*2+1);
return ;
}
void fun(int node,int tag){
if(tag<=sub.size()){
if(node<origin.size()){
origin[node-1]=sub[tag-1];
}
else{
origin.push_back(sub[tag-1]);
};
fun(node*2,tag*2);
fun(node*2+1,tag*2+1);
}
else return;
}
int main()
{
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]!=','&&s[i]!='['&&s[i]!=']')origin.push_back(s[i]-'0');
}
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]!='/')dir.push_back(s[i]-'0');
}
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]!=','&&s[i]!='['&&s[i]!=']')sub.push_back(s[i]-'0');
}
// for(int i=0;i<origin.size();i++)cout<<origin[i];
// for(int i=0;i<dir.size();i++)cout<<dir[i];
// for(int i=0;i<sub.size();i++)cout<<sub[i];
int i=1;
int node=1;
while(i<dir.size()){
if(origin[node*2-1]==dir[i])node=node*2;
else if(origin[node*2]==dir[i])node=node*2+1;
i++;
}
//for(int i=0;i<origin.size();i++)cout<<origin[i];
clear(node);
fun(node,1);
// please define the C++ input here. For example: int a,b; cin>>a>>b;;
// please finish the function body here.
// please define the C++ output here. For example:cout<<____<<endl;
cout<<'['<<origin[0];
for(int i=1;i<origin.size();i++)if(origin[i]!=0)cout<<','<<origin[i];
cout<<']';
return 0;
}
寻找最短路径(300分)
给定一个树,树上的节点标号x表示在该节点能处理x个任务,x同时表示在该节点停留的时间,此外,x与y节点如果存在父子节点关系,那么|x-y|表示从x节点跳转到y节点的时长,同时也是y节点跳转到x节点的时长。
输入四行
第一行:节点总数
第二行:层次遍历树的每个节点,得到每个节点标号组成的数组
第三行:层次遍历树的每个节点,得到每个节点父节点的标号组成的数组,一个节点最多有两个子节点,根节点的父节点标号用0表示
第四行:任务总数
输出:完成任务所用的最短时间;若不能完成任务,则输出-1
不规定路径的起点,将该树当成图看待,树中的任意一段路径上的节点序号之和大于或等于任务总数,那它就是可以用于考虑用时是否最短的路径,路径中的每个节点只能出现一次。
这道题还是用dfs做就好了,所有可能的路径遍历一次,看看符合条件的路径中哪条路径用时最短,记得用一个标签标识某个节点是不是已经走过了,小编当时敲完了代码提交之后编译错误,然后就时间结束了,呜呜呜~