7.25-2014新生暑假个人排位赛06

本文精选了几道算法竞赛题目并提供了详细的解题思路与代码实现,包括最小生成树、状态压缩DP、DFS搜索等核心算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



A题Kruskal+并查集。注意要先把已经修好的路遍历一遍形成最小生成树。

还有。我把修好的路看成1,未修好的路看成0.以后要认真读题啊警示自己~~~


-----------------------------------我是可爱的分割线--------------------------------------------


B、高兴

题意:每两个东西相邻有一个高兴值。找出总高兴值最大的排列。

输入样例

2
0 1
2 0
3
0 -1 7
3 0 3
3 3 0

输出样例

2 
10


解法:

1.把链状想象成首尾断开的环状。就可以转换为状态压缩dp的旅行商问题。

2.旅行商问题:从顶点0出发,每个顶点走一遍,最后回到顶点。求权值最小值。

而这道题,只需转换为不加上最后回到起点的那条边,并且改为求权值的最大值即可。

代码如下:

int rec(int S,int v)
{
    if(dp[S][v]>-INF)
        return dp[S][v];
    if(S==(1<<n)-1)
        return dp[S][v]=0;
    int res=-INF;
    for(int u=0;u<n;u++)
        if(!(S>>u&1))
        {
            int temp=rec(S|1<<u,u)+toy[v][u];
            if(temp>res)
            {
                res=temp;
            }
        }
    return dp[S][v]=res;
}

3.把每个物品都放在起点试一试,找出最大的权值。输出即可。



C、排序

题意:给n个数,从小到大输出。

输入样例

3
4 2 1

输出样例

1 2 4


解法:





D、爱好和平

题意:每两个顶点之间有且仅有一条边相连。现要求破坏其中一个顶点,得到两颗子树(或一条链),得到两棵中较大的那棵拥有的顶点数,求顶点数最小值。

输入样例

5 4
1 2
1 3
1 4
4 5

输出样例

1


解法:

1、如果这是一个圈,直接输出1;

2、如果是一棵树,用dfs(深度优先搜索)遍历。每个顶点的值就是它所有儿子节点的值相加。

     具体实现:把max置为0,dfs遍历一遍它的孩子,每dfs一个孩子就把孩子的节点值加到max上,走完所有节点后,把当前节点的数组的值变为max(dp[n]=max)。

3、dfs结束后,把每个顶点都试一遍。最大子树的值maxson=max(maxson,dp[sole[j].v]);

4、注意!3中不要搜索自己的父亲。



E.萌学妹的手机(黑完学姐黑学妹。。。)

题意:在一副都是六边形的图片中。给出六边形边长找到起点和终点需要穿过的最少的边数。

输入样例

2
2.0
0 0
6 -1
2.0
0 0
9 -1

输出样例

2
3


解法:

1、先转换为斜60°的坐标。

因为实在找不到六边形就只能用小乌龟假装六边形了。


坐标转换:Sx=x-(y)/sqrt(3.0);

        Sy=((y)*2.0)/sqrt(3.0);

2、把两个点周围搜一遍,找到最近的六边形中心。。。。。

3、



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值