包头师范学院第七届ACM大学生程序设计竞赛

 

A.2021bttcacm*N

题目描述

欢迎参加第七届包头师范学院大学生程序设计竞赛!请各位亲积极编程,争取解决更多问题,为你的学院和班级争光!加油吧!
这个题目很简单,输入一个正整数n,然后输出n次BTTCACM即可。

输入格式

输入一个正整数n。1<=n<=1000。

输出格式

输出n次BTTCACM,每次输出后需要回车换行。详见样例。

输入样例 

3

输出样例  

BTTCACM
BTTCACM
BTTCACM

 代码:

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        while(n--)
            cout<<"BTTCACM"<<endl;
    }
    return 0;
}

B.2021职业选手

职业选手

        小Z学长最近沉迷各种PVP(Player Vs Player,玩家对玩家)网络游戏,小Z学长简直就要气炸了!

为什么会这么说呢?原来对面的玩家仿佛是职业选手,小Z同学觉得自己安全的时候,对面的玩家一通操作就把小Z同学送回了老家,哦天哪!小Z同学只能望着黑白的画面长叹,这就是职业选手吗?

那么职业选手为什么能够精准的算出伤害从而击杀小Z学长呢?说到底还是因为小Z学长对数值不够敏感!

游戏内共有血量,攻击力,防御力,额外伤害,暴击期望 五种数值。而当伤害达到或超过对方的血量时,我们就称对方到达了“斩杀线”,只要会算伤害,就知道对方能不能斩杀你,你能不能斩杀对面。

那么伤害要如何计算呢?在这里我们采用如下计算方法:

攻击力 * 暴击期望 + 额外伤害 就是玩家所能打出的伤害,而敌人的防御力则呈现百分比的形式将伤害扣除。

在这个算式下得出的伤害就是玩家的最终伤害,伤害值达到或高过血量就是进入了“斩杀线”。

现在小Z学长知道自己的血量、攻击力、防御力、额外伤害、暴击期望五项数值,而他也同样知道对方的这五样数值,他想知道两个人谁会胜利! 。

输入格式

输入共两行,

第一行是小Z学长的血量HP、攻击力ATK、防御力DEF、额外伤害DMG、暴击期望Crit,其中DEF是不超过100的整数代表防御的百分比。

第二行是敌方的血量HP、攻击力ATK、防御力DEF、额外伤害DMG、暴击期望Crit,其中DEF是不超过100的整数代表防御的百分比。

输出格式

如果双方都不在斩杀线内,           请输出  easy farm.

如果小Z学长在对方的斩杀线内,但是对方不在小Z斩杀线内,请输出  where is my teammate?

如果敌方在小Z学长的斩杀线内, 但是小Z不在小Z斩杀线内,请输出  Your Soul Is Mine~

如果双方都在彼此的斩杀线内,   请输出  wo neng fan sha!

输出答案后回车换行。

输入样例 

9999 9999 0 9999 9999
9999 0 0 0 0

输出样例 

Your Soul Is Mine~

数据范围与提示

题目中不存在特大数据

题目分析:

通过题意可知,小Z学长和敌方造成的伤害为攻击力 * 暴击期望 + 额外伤害 。而承受的实际伤害为以百分比形式防御对方造成的伤害,即injured= 对方的(攻击力 * 暴击期望 + 额外伤害 )*(100-自己的防御力)*0.01(此处为百分比形式,所以乘0.01转化为实际值)

如果对方造成的injured大于等于自己的血量,即到了斩杀线。

代码:

#include<bits/stdc++.h>
using namespace std;
///    0      1       2        3         4
///  血量  攻击力  防御力  额外伤害  暴击期望
int main()
{
    double a[5],b[5];
    for(int i=0;i<5;i++)
        cin>>a[i];
    for(int i=0;i<5;i++)
        cin>>b[i];
    int mark1=0,mark2=0;///判断两人是否在斩杀线
    ///injured=对方的(攻击力 * 暴击期望 + 额外伤害 )*(100-自己的防御力)*0.01
    double injureda=(a[1]*a[4]+a[3])*(100-b[2])*0.01;
    double injuredb=(b[1]*b[4]+b[3])*(100-a[2])*0.01;
    if(injureda>=b[0])
        mark2=1;///敌方在斩杀线
    if(injuredb>=a[0])
        mark1=1;///小Z在斩杀线
    if(mark1==0&&mark2==0)
        cout<<"easy farm."<<endl;
    else if(mark1==0&&mark2==1)
        cout<<"Your Soul Is Mine~"<<endl;
    else if(mark1==1&&mark2==0)
        cout<<"where is my teammate?"<<endl;
    else
        cout<<"wo neng fan sha!"<<endl;
    return 0;
}

C.2021十五日的救赎

十五日的救赎

        终于到了十五日了,每个月的十五日,正是对于小Z学长的救赎——从名为的氪金的地狱当中,被救赎的花呗~

就像每个月的十五日不一定就是第十五日一样,小Z学长玩的手游网络游戏也不一定就必须要氪金,但是不氪金哪里来的韭菜呢?为了表达自己是一个合格的韭菜,小Z学长每个月都会在自己游玩的手游网络游戏中氪金!

氪金价位分各种优惠额度,是这么计算的:


 

标注为原价的6元普通礼包:1颗宝石

标注为特卖的30元限定礼包:5颗宝石

标注为限时优惠的98元优惠礼包:15颗宝石

标注为超值的198元超值大礼包:30颗钻石

标注为限购一次的298元尊享礼包:45颗宝石

标注为VIP12解锁的648元终极礼包:100颗宝石


 

怎么样,只要10颗宝石就能抽一次十连抽呢!而且大约200抽就能必出一个小Z学长想要的东西,真是太划算啦!!!

现在小Z学长知道自己需要多少颗宝石去抽保底了,但是他想知道自己最少要花多少钱才能买齐N个宝石呢,请你告诉他吧!

而在这其中,648作为一个消费的门槛,被小Z学长亲切的称为“单”!如果消费每满足648一次,就称为“一单”!小Z学长还想知道自己需要多少单!

输出格式

输出内容的第一行是一个数,代表小Z学长的最少花费。

如果小Z学长的消费超过了648元,输出的第二行是一个数和一个字符串"dan",代表小Z学长共消费了多少单。

比如输入数据为648的情况下第二行的输出则为1dan。

输出数据后回车换行。

输入样例 

2

输出样例 

12

数据范围与提示

样例数据中,小Z学长只买6元的礼包是最优情况,如果买30元的礼包一样可以满足情况,但是花费的钱会更多。

题目分析:

通过题意可知,要找出买N个宝石花费最少的情况。

通过分析题目我们可以知道

标注为原价的6元普通礼包:1颗宝石                     (单价为6元/1颗)

标注为特卖的30元限定礼包:5颗宝石                   (单价为6元/1颗)

标注为限时优惠的98元优惠礼包:15颗宝石           (单价为6.5元/1颗)

标注为超值的198元超值大礼包:30颗钻石             (单价为6.6元/1颗)

标注为限购一次的298元尊享礼包:45颗宝石         (单价为6.62元/1颗)

标注为VIP12解锁的648元终极礼包:100颗宝石     (单价为6.48元/1颗)

所以!最优情况就是6元/1颗的情况

最后加上超过648的情况即可

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int sum=0;
        sum=n*6;
        cout<<sum<<endl;
        if(sum>648)
        {
            cout<<sum/648<<"dan"<<endl;
        }
    }
}

D.2021步履蹒跚

【步履蹒跚】
 

        小Z学长睡觉总喜欢漏半条腿,这下可好,今天的风那叫一个大啊,直接给小Z学长整抽筋了!

太恐怖了,本来平时小Z学长都是先迈左腿走路的,结果现在左腿抽筋了只能先迈右腿走路了!本来小Z学长都是先左腿支地起床的现在只能右腿支地起床了!本来小Z学长是先左脚迈入公司大门的今天是右脚结果被开除了!真是令人潸然泪下的编造故事......

虽然故事是虚造的,但对于小Z学长来说,所谓的抵达是一种定义,小Z学长一旦被人要求抵达的话,那他就一定会迈步到终点。哪怕会因为右脚先迈入公司被开除...

虽然小Z学长不会因为右脚先迈入公司被开除,但是小Z学长还是十分在意走路的效率的,毕竟腿脚不方便,

如果小Z学长有什么要走到的地方,那他会用最快的方式行进。

现在小Z学长的左脚因为抽筋的缘故,只能一次性迈一小步(1M), 或者一大步(7M),

而右脚可以正常走路,为了考虑左脚的感受,右脚只能迈出 4M 以内的距离,可以是0.2M,也可以是1.4M。

现在小Z学长想知道步履蹒跚的自己去往一个地方的话,他需要最少走多少步才能抵达目标地点呢?

如果超过10000步可就对小Z学长来说太远啦,他会回复你一句 .Gei Wo QIAN ma?,可能这就是傲娇吧。

当然,小Z学长其实没有什么强迫症,他不会纠结一种概念: 在一种定义当中,如果要把事物的逻辑抽象成数字符号的语言定义的话,他不会要把他强行等价成对应的符号,只需要事物的处理逻辑本身完成即可。

换句话说,也就是在面对未知的挑战时,他不会要求做到尽善尽美,而是会选择“能够完成”的地步就可以满足了。

比如在处理到达的逻辑时,他就不会把它等价为数据逻辑当中的相等符号,而是“能够到达就可以”的逻辑妥协,最后处理为其他数学符号。

你说这是懈怠还是处事圆滑呢?我们尚且不得而知,重要的是结果OK就好......

 

输入格式

一行整数数字 N,代表终点距小Z学长的距离。

输出格式

输出的第一行是一个整数步数,代表小Z学长最少需要多少步才可以抵达终点。

如果超过10000,补充输出的第二行则是 .Gei Wo QIAN ma?

输出数据后输出回车换行。

输入样例 

12

输出样例 

3

数据范围与提示

N的取值范围是[ 0, 2^{63}]

样例数据中,4+7+1 = 12,一共需要三步。

题目分析:

题目重点:1.先迈右腿

                  2.右脚最多迈出4m

                  3.左脚可以迈出1m或7m

                  4.要最快的方式

                  5.如果超过10000步要输出一句 .Gei Wo QIAN ma?

结合1,2,3,4可知,每次迈出一步,右腿为4m,左腿为7m,且先4后7

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    while(cin>>n)
    {
        long long ans=0;
        if(n>11)
        {
            ans+=(n/11)*2;
            n%=11;
        }
        while(n)
        {
            n-=4;
            ans++;
            if(n<=0)
                break;
            n-=7;
            ans++;
            if(n<=0)
                break;
        }
        cout<<ans<<endl;
        if(ans>10000)
            cout<<".Gei Wo QIAN ma?"<<endl;
    }
    return 0;
}

H.2021真正的伙伴

【真正的伙伴】

小Z学长很久以前了一个竞赛团队,那时他的编程等级是全小队最高的,但没过多久,小队中的成员便一个个都等级提升、赶超了上来。

本来团队壮大是一件好事,但是现在团队的贤者提出了一个观点:“小Z学长,你现在的实力到底如何呢?是不但实力在平均线以下,更是你的实力排名已经在队伍的末尾了吧!你不是我们真正的伙伴!”

糟了!如果这样下去,小Z学长因为不是真正的伙伴,就要被逐出竞赛小队去边境展开咸鱼生活了!现在小Z学长想知道,自己到底是不是真正的伙伴!!!

输入格式

输入的第一行是一个正整数N和一个数字SCORE,代表竞赛小队一共有多少人,以及小Z学长的实力水平。 接下来的N-1行每行一个数字,代表小队其他成员的实力水平。
题目数据保证 N >= 3

输出格式

输出共一行,分四种具体情况。

如果小Z学长是"真正的伙伴"(分数在平均线及以上,且不在倒数三名之内),        请输出  EZ

如果小Z学长的实力水平在平均数水平以下,但是不在倒数三名之内,                    请输出  you so weak.

如果小Z学长的排名在倒数三名之内,但是分数在平均线及以上,                          请输出  are you serious?

如果“真正的伙伴”两个条件都不满足(也即排在后三名,且分数低于平均分),       请输出  W0 GUN!!!

输出答案后,回车换行。

输入样例 

4 4
1
2
3

输出样例 

EZ

数据范围与提示

题目保证竞赛小队中没有实力相差小于0.000000001的人 

题目分析:

通过数据范围与提示可知,没有任意两人水平相等。所以可以直接用数组排序,判断即可知。另外,题目中并没有说水平是整数。所以需要用浮点数。

代码:

#include<bits/stdc++.h>

using namespace std;
int main()
{
    int n;
    double a[1005];
    double s;
    while(cin>>n>>s)
    {
        double sum=s;
        a[0]=s;
        for(int i=1;i<n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        sort(a,a+n);
        int mark=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]==s)
                mark=i+1;
        }
        sum=sum/n;
        if(s>=sum&&mark>3)
            cout<<"EZ"<<endl;
        else if(s<sum&&mark>3)
            cout<<"you so weak."<<endl;
        else if(s>=sum&&mark<=3)
            cout<<"are you serious?"<<endl;
        else if(s<sum&&mark<=3)
            cout<<"W0 GUN!!!"<<endl;
    }
    return 0;
}

I.2021齿轮

题目描述

白崴学长购买新机器,由于不合理,有很多冗余的齿轮。
整个机器由一个连在电动机上的大齿轮驱动,这个齿轮被安装在位置(0,0)。
白崴学长希望知道,在这个机器启动后,最后转动起来的齿轮是哪一个。
白崴学长详尽地记录了所有N (2 <= N <= 1080)个齿轮的位置 xi, yi (-5,000 <= xi <= 5,000; -5,000 <= yi <= 5,000)和半径ri (3 <= ri <= 1024)。
你的任务是,找出整个传动系统末端的齿轮(一个被其他齿轮带动,但没有带动其他任何装置的齿轮)的位置。
除了驱动整个机器的大齿轮,其他齿轮都只会被另一个齿轮带动。 

输入格式

第1行: 1个整数N 
第2~N+1行: 第i+1行给出了齿轮i的参数:xi,yi,以及ri 

输出格式

第1行: 输出2个用空格隔开的整数x,y,表示传动系统末端齿轮的位置

输入样例 

3
0 0 30
30 40 20
-15 100 55

输出样例 

-15 100

数据范围与提示

机器中一共有3个齿轮。第一个齿轮被放在原点,半径为30。它带动了位于(30,40)的半径为20的齿轮,于是位置为(-15,100)的半径为55的齿轮最终被第二个齿轮带动。 

题目分析:

通过题意可知,除了(0,0)点的齿轮,每一个齿轮都会被另一个带动,而且每一个齿轮最多也只会带动一个。此题我用深搜解,从(0,0)点开始,每一个给编号,编号为n的就是末端的齿轮

判断齿轮是否带动的条件即两个圆是否相切。即两圆点距离等于两圆半径之和。

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
struct circle
{
    int x;
    int y;
    int r;
    int num;///编号
}temp[1085];
int mark[1085];
int ans;
void dfs(int k)
{
    if(temp[k].num==n)
    {
        ans=k;
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(mark[i]==0)
        {
            double d=sqrt(pow(temp[i].x-temp[k].x,2)+pow(temp[i].y-temp[k].y,2));
            if(d==temp[i].r+temp[k].r)
            {
                mark[i]=1;
                temp[i].num=temp[k].num+1;
                dfs(i);
            }
        }
    }
}
int main()
{
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>temp[i].x>>temp[i].y>>temp[i].r;
            temp[i].num=0;
        }
        memset(mark,0,sizeof(mark));
        for(int i=0;i<n;i++)
        {
            if(temp[i].x==0&&temp[i].y==0)
            {
                mark[i]=1;
                temp[i].num=1;
                dfs(i);
            }
        }
        cout<<temp[ans].x<<" "<<temp[ans].y<<endl;
    }
    return 0;
}

K.2021 单据录入

题目描述

【单据录入】
踏上旅途的小Z同学游历四方,终于得到了他一展身手的机会!小Z找到了一个公司,他终于可以在这里释放他的代码能量,将单据录入到系统当中啦!

公司会先输入“type”,提供给他一组单据字段,一组字段由两个字符串组成,第一个字段是单据的实体类名字段,第二个字段是单据的代码名称,如“水果 fruit”,就代表我们可以用fruit来录入水果信息!

在那之后,公司还会输入“input”,代表已经提供了所有的单据字段,要开始录入具体的单据信息了!
同样是一组由两个字符串组成,第一个字段是单据的代码名称,第二个字段是单据的具体录入信息!

如果单据中已经拥有具体录入信息的话,因为客户没有购买相对应的版本迭代功能,我们会把具体的录入信息覆盖
当然,因为公司的录入人有可能会因为粗心漏掉某些单据,请不要忘了把他们把"null"补充上哦!

最后,公司会输入一个字符串"end"结束单据的录入,最后特别要注意,不是所有员工都会注意编码守则,因此会有将命令当作字段使用的人存在哦......

输入格式

第一行是一个单独的 type,代表开始录入单据字段信息。
接下来的n行,每行由两个字符串组成,中间由空格分隔,第一个字符串是单据的实体类名字段,第二个字符串是单据的代码名称。

接下来一行是一个单独的 input,代表开始录入单据具体数据信息。
接下来的m行,每行由两个字符串组成,第一个字符串是与单据的代码名称,第二个字符串是单据的具体录入信息。

最后一行单独的”end",代表录入信息结束。

n和m不会超过1000000

输出格式

输出一共有n行,每行由两个字符串组成,字符串中间以 ":" 分开。
第一个字符串是单据的字段类名,第二个字符串是单据的具体信息
每条数据输出之后回车换行,详见样例数据。

输入样例 

type
peach p
apple a
bed b
input
a 20211125
p 20211126
end

输出样例 

peach:20211125
apple:20211126
bed:null

数据范围与提示

题目保证 type 中同一个实体类名字段只会出现一次,单据的代码名称不会重复。
如果感觉代码正确但依旧错误的话,请仔细查看描述哦...

题目分析:

当输入的字符串为type时,开始读入数据,每个字符串由两个字符串组成。但是因为无法排除这两个字符串与题目中type,input,end重名的可能。所以需要用getline进行输入。

#include<bits/stdc++.h>
using namespace std;
struct temp
{
    string name;
    string newname;
    string num;
}temp[1005];
int main()
{
    int k=0;
    string str;
    int mark=0;
    string str1,str2;
    while(getline(cin,str))
    {
        if(str=="type")
        {
            continue;
        }
        else if(str=="input")
        {
            mark=1;
        }
        else if(str=="end")
        {
            break;
        }
        else
        {
            if(mark==0)
            {
                str1=str.substr(0,str.find(" ",0));
                str2=str.substr(str.find(" ",0)+1,str.size());
                //cout<<str1<<" "<<str2<<endl;
                temp[k].name=str1;
                temp[k].newname=str2;
                temp[k].num="null";
                k++;
            }
            else
            {
                str1=str.substr(0,str.find(" ",0));
                str2=str.substr(str.find(" ",0)+1,str.size());
                for(int i=0;i<k;i++)
                {
                    if(str1==temp[i].newname)
                        temp[i].num=str2;
                }
            }
        }
    }
    for(int i=0;i<k;i++)
    {
        cout<<temp[i].name<<":"<<temp[i].num<<endl;
    }
    return 0;
}

L.2021鱿鱼游戏

题目描述

【鱿鱼游戏】
应该有很多同学都看过《鱿鱼游戏》吧?即使没有看过,相信爱刷抖音的小伙伴们也应该在抖音上刷到过,这是一部最近比较火的一部韩剧,《鱿鱼游戏》主要讲述一群走投无路并急需金钱的人收到神秘邀请,邀请他们共同加入一场游戏。
为了赢取 456 亿韩元奖金,背景各异的 456 名参赛者被关在秘密场所进行游戏。每一轮游戏都是韩国人小时候就会玩的传统游戏,如一二三木头人,但闯关失败的后果则是死亡。
周学长追这部剧追疯了,他甚至做梦都梦见了自己加入了鱿鱼游戏,他梦见在一个关卡中,所有人被红衣人两两分为了一组,现在每组人的面前都放了两筐纸条,这两筐内的纸条都是一样的,每张纸条上都写了10位数字,现在游戏规则是要求组内的两个人在2分钟内从各自的筐中选出一张纸条,最后谁的纸条上的数字递增子序列长谁就获胜,如果一样长则组内两人都闯关成功,在这轮游戏中周学长和赵学长被分到了一组,现在如果你是裁判请你判断下谁会闯关成功。

输入格式

共n组数据,每组两行 第一行是周学长纸条上的一串数字 第二行是赵学长纸条上的一串数字 (数字范围0~9)。

输出格式

如果闯关成功的是周学长 输出:zhou
如果闯关成功的是赵学长 输出:zhao
如果两位都闯关成功 输出: all

输入样例 

3
0123456789
0123456789
0001230045
0000000123
9999999999
0300000000

输出样例 

all
zhou
zhao

题目分析:

通过题意可知,本题求的是最长递增子序列,即可用动态规划求解。

而要用动规求解,就要知道dp数组里存的是什么?

dp[ i ]里存的是以num[ i ] 为结尾的最长递增子序列长度。

具体看图:

 代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        while(n--)
        {
            string str1,str2;
            int dp1[15]={0},dp2[15]={0};
            cin>>str1>>str2;
            int mark1=0,mark2=0;
            for(int i=0; i<10; i++)
            {
                dp1[i]=1;
                for(int j=0; j<i; j++)
                {
                    if(str1[i]>str1[j]&&dp1[j]+1>dp1[i])
                        dp1[i]=dp1[j]+1;
                }
                mark1=max(mark1,dp1[i]);
            }
            for(int i=0; i<10; i++)
            {
                dp2[i]=1;
                for(int j=0; j<i; j++)
                {
                    if(str2[i]>str2[j]&&dp2[j]+1>dp2[i])
                        dp2[i]=dp2[j]+1;
                }
                mark2=max(mark2,dp2[i]);
            }
            if(mark1==mark2)
                cout<<"all"<<endl;
            else if(mark1>mark2)
                cout<<"zhou"<<endl;
            else
                cout<<"zhao"<<endl;
        }
    }
    return 0;
}

M.2021街溜子老Z

题目描述

街溜子老Z有一个失散多年的在南方搞工程的好大哥,最近老Z也没事干,打算从他的所在地去找他的好大哥一起搞搞工程,老Z这个人也没什么爱好,可能除了爱吹牛就是爱溜达了,老Z从小就在小镇里待着,也没见过什么世面,所以这次出行他打算在去往南方的途中多溜达几个5A级的景区,但是路上有好多5A景区,去找大哥的路也不止一条,他现在想知道在找好大哥的路途中,怎么走才能溜达最多的5A级景区,聪明绝顶的你能帮帮他么?

输入格式

第一行三个正整数 N,S,E,分别表示城市的个数,老Z所在城市,好大哥所在城市;
第二行 N 个正整数 K,表示每个城市拥有的 5A 级景区个数;
接下来的 N-1 行,每行有两个正整数 A,B,表示能从 A 城市到达 B 城市。

输出格式

输出老 Z 最多能溜达多少个景点,如果从老 Z 不能到达好大哥所在的城市,则输出 -1 表示遗憾。输出答案后回车换行。

输入样例 

5 1 3
1 5 1 2 2
1 2
2 3
3 4
1 4

输出样例 

7

数据范围与提示

数据范围: 1 <= N <= 1000, 1 <= K <= 20000, 1<= A, B, S, E <= N

题目分析:

通过题目可知,每个城市都有一定数量的5A景区,需要求解从X城市(即老Z所在城市)到Y城市(即好大哥所在城市)经过的城市最多能经过多少个景区。

解题思路:

用vector 数组存A城市与B城市相通,当遇到X城市时进入搜索,搜索能经过的城市,在过程中取最大值。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,x,y,a,b;
int value[1055];
int mark[1055];
vector < pair<int ,int> > vec;///定义一个数组用来存城市A与城市B相连
int ans=0;
int sum=0;
int flag=0;
void dfs(int k)
{
    if(vec[k].second==y)///DFS出口为B城市是Y城市
    {
        flag=1;
        ans=max(ans,sum);///比较取最大值
        return ;
    }
    for(int i=0;i<vec.size();i++)
    {
        if(mark[i]==0&&vec[i].first==vec[k].second)///数组第i个的A城市是第K个的B城市 继续搜索
        {
            mark[i]=1;
            sum+=value[vec[i].first];
            dfs(i);
            sum-=value[vec[i].first];
            mark[i]=0;
        }
    }
}
int main()
{
    while(cin>>n>>x>>y)
    {
        for(int i=1;i<=n;i++)
            cin>>value[i];
        ans=value[x]+value[y];///用来存结果
        sum=value[x]+value[y];///存每一个可行的方案对应的答案
        n--;
        flag=0;
        while(n--)
        {
            cin>>a>>b;
            vec.push_back( {a,b} );
        }
        for(int i=0;i!=vec.size();i++)
        {
            //cout<<vec[i].first<<" "<<vec[i].second<<endl;
            if(vec[i].first==x)///如果数组里的A城市是X城市  进入DFS
            {
                mark[i]=1;
                dfs(i);
                mark[i]=0;
            }
        }
        if(flag!=0)
            cout<<ans<<endl;
        else
            cout<<-1<<endl;
    }
    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值