什么是蓝桥杯?
官方解释是:蓝桥杯大赛是工信部人才交流中心举办的全国性专业信息技术赛事。这个比赛最早是针对大学生群体的编程赛事。
自从2016年第八届蓝桥杯开始,在原有的大学生数个专业编程组别的基础上增加了中小学创意编程组,简称【青少组】,第11届竞赛,超过4万名中小学参加了青少年组的比赛,第12届起,STEMA评测考试替代了青少年组的地区选拔赛,主要是评测学生的【科技素养】、【逻辑思维】、【编程能力】按照省份给出综合评测成绩。
简单讲就是这是一个编程领域专业性的全国比赛,初赛选拔是考STEMA(科学(Science)、技术(Technology)、工程(Engineering)、数学(Mathematics)、艺术(Arts))
对的,除了考编程还需要考一些“课外知识”,两部分分数占比是五比五,同等重要。
先给大家说说蓝桥杯的大概比赛时间吧:比赛分为初赛(STEMA选拔赛)——省赛——国赛
初赛一年五到六次,一般是每年8,10,11,1,3这几个月份进行。四月份省赛,五月份国赛。
然后是晋级规则:
一等奖晋级机制:初赛一等奖可以直接进国赛;初赛二等奖,三等奖,优秀奖,需要参加第二轮的省赛;省赛一等奖才能晋级国赛。
总的来说,如果想走到全国总决赛,要么初赛是一等奖,要么省赛是一等奖,相当于给了每个考生2次机会。
第一题:结点选择
题干:
有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了, 那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?
解题思路: 这题模型是树形动态规划入门题目, dp[i][0]表示该节点不被选择,dp[i][1]表示该结点被选择。 转移方程为: dp[u][1]+=dp[v][0];//选择了 u 结点,则与它邻接的结点不选; dp[u][0]+=max(dp[v][0],dp[v][1]);不选择 u 结点,则与它邻接的结点选择结果最 大的; 应该特别注意:该题结点数量较大,应该选用邻接表存储边的关系。
#include<cstdio>
#include<cstring>
#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 100010
bool vis[maxn];
int dp[maxn][2];
int father[maxn];
int head[maxn];
int n;
int cnt;
struct Edge
{
int to,next;
}edge[2*maxn];
void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void treedp(int u)
{
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v])
{
treedp(v);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][1],dp[v][0]);
}
}
}
void init()
{
cnt=0;
memset(dp,0,sizeof(dp));
memset(father,0,sizeof