您的位置:首页 > 其它

蓝桥杯官网练习系统历届真题详解

2014-03-06 12:53 435 查看
欢迎评论指出错误,提出疑问,或者不介意给出更好的解法,有交流才有进步。

PREV-3(带分数)

这道题就简单的求1-9九个数组成的带分数来表示数值n的个数

枚举1-9九个数组成的全排列,然后把每种排列分成整数、分子、分母三段

然后简单判断以下每个带分数是否和n相等

这里的剪枝在于枚举整数、分子、分母分别的位数

分母的位数肯定小于等于分子的位数

整数的位数肯定小于等于n的位数

<C++> Code

#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 100010 //不知n为多大,随便定义了个,可以定义更大,也可以想想用vector容器
#define LL long long

int n;
LL Dp[MAXN],Max[MAXN],ans;//全区变量自动初始化为0

//链式前向星
int head[MAXN],m=1;//因为head[]中元素都为0,所以m从1计数就不用初始化head[]了
struct Edge{
int to,next,w;
}e[MAXN];

//链式前向星添加边
void add_edge(int u,int v,int w){
e[m].to = v;
e[m].w = w;
e[m].next = head[u];
head[u] = m++;
}

bool f[MAXN];//标记节点是否已被访问过
void dfs(int s){
int k = head[s];
while(k > 0){
int t = e[k].to;//t为s的孩子节点
if(!f[t]){
f[t] = true;
dfs(t);
Max[s] = max(Max[s] , Dp[s] + Dp[t]+e[k].w);//以s为根节点的子树中 经过s的最大两点间距离
Dp[s] = max(Dp[s] , Dp[t]+e[k].w);//s到叶子节点的最长距离
}
k = e[k].next;
}
ans=max(ans,Max[s]);
}

void work(){
f[1]=true;
dfs(1);//以节点1为根节点深搜 ,深搜前标记1被访问
printf("%I64d\n",ans*(21+ans)/2);
}

void init(){
scanf("%d",&n);
int p,q,d;
for(int i = 1 ; i < n ; i++){
scanf("%d%d%d",&p,&q,&d);
add_edge(p,q,d);
add_edge(q,p,d);//双向边建图,方便dfs
}
}

int main()
{
init();
work();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: