欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

upc 个人训练赛第十四场:足球联赛+皇家棋神

程序员文章站 2023-12-31 15:53:04
...

问题 B: 足球联赛

题目描述
在足球比赛中,各国主要以联赛方式进行:
联赛中,每个队伍都会两两进行主客场交手,获得胜利的队伍全取3分;失利的队伍不得分;若双方战平,则各得1分。而统计球队的积分,则难坏了小明,他想要请你开发一个软件,帮他统计一下整个赛季结束之后各个球队的积分情况,以便向外界公布。

输入
第一行一个整数N,表示共有N个球队。2<=N<=50.
接下来N行,表示每个球队在主场作战的情况。每行共N个元素,“W”表示主队获胜,“D”表示双方战平,“L”表示主队失利。自己和自己用“-”表示。

输出
共1行。N个数,表示N个球队的积分情况,中间用空格分隔,最后一个球队后不要有空格。

样例输入 Copy
3
-WW
W-W
WW-
样例输出 Copy
6 6 6
提示
三个球队在主场都取得了两胜,同积6分、

思路:
这个题目不是很难,但当时我没有完全理解,wa了两遍。
例如,在第一个球队的主场,这个球队输了,相应的另一个球队就应该是客场赢了,所以要给另外一个球队加3分;同样的平局也是这样,需要给两个球队同时加1分,理解了之后代码就出来了

int n,ans;
char s[55][55];
int a[55];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) cin >> s[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(s[i][j] == 'W')  a[i] += 3;//主场胜利
            else if(s[i][j] == 'L') a[j] += 3;
            //主场失利,给另一个球队加3分
            else if(s[i][j] == 'D'){//平局,各加1分
                a[i]++;
                a[j]++;
            }
        }
    }
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

问题 D: 皇家棋神

题目描述
看到下图,拥有QQ宠物的同学对下图一定不会陌生,没错这就是QQ宠物皇家战棋。自从2009元旦前夕腾讯推出该款游戏,迅速成为热门游戏,不仅仅因为其可爱的造型,更有元宝和蓝钻的诱惑。
小明为了给自己的宠物赚取足够的生活费,也加入了激烈的角逐。由于战术运用得当,加上些许的运气,小明屡战屡胜。转眼间,时间过去了2个月,小明也成为了名副其实的万元户+大城主,宠物也衣食无忧。
而此时的玩家,都已具备了一定的战术经验,小明也占不到丝毫便宜,大多数时候只能靠运气取胜,此时皇家战棋也变得索然无味。于是小明开始思考另外一个有趣的问题,若是每个战棋能自我成长,又能训练新兵,那一定很有意思。
有一天,在一个毫无防备力量的城邦,诞生了一名划时代的领袖(当然他也是从士兵做起),每过一个时刻,任何一个作战单位的战斗力就会提升一分,而每个作战单位在提升力量的同时,又会培养一名新兵作为下属,每个作战单位所能拥有的下属数量上限为k。小明很想知道,在给定下属上限数量k的情况下,第n个时刻该城邦所具有的总战斗力。
在k=2,n=5时情况如下:
upc 个人训练赛第十四场:足球联赛+皇家棋神
在第5个时刻,城邦的领袖,已经蜕变为将军,而整个军队的战斗力也从第1个时刻的1,变为26。而随着军队战斗力与部队数量的增加,城邦已经有足够的力量抵御外敌,城邦的战斗力在到达或者超过1234567890之后,每个战斗单位的战斗力将不再增加,也不再训练新兵。
小明想要知道,在第n时刻,每个单位最大下属数量为k时,城邦的战斗力。

输入
第一行包含2个正整数n和k,1<=n,k<=2^32-1。
输出
共1行,第n时刻城邦所具有的总战斗力。
样例输入 Copy
5 2
样例输出 Copy
26

思路:
题面很长,但是读完之后会很容易理解,他的大概意思就是,这个城邦一开始只有一个领袖战斗力为1,每过一个时刻,每个人的战斗力可以加一,同时存在的人可以再训练一个新兵,但是每一个人只能训练k个兵。把图画出来之后,我们会发现这是一个类似二叉树的东西,我们只需要记录当前的人数和时刻即可

ll n,k,x,ans;
ll a[maxn];
const ll inf =  1234567890;
int main()
{
    scanf("%lld%lld",&n,&k);
    x = 1;
    a[0] = 0,a[1] = 1;
    for(ll i=2;i<=n;i++)//循环当前时刻 
    {
        a[i] = x+i;//每次增加的战斗力 
        x += a[i];//每次新培养的下属数量 
        if(i >= k)   x -= a[i-k];
        //每个人只能有k个下属 
        if(a[i] >= inf){
            ans = a[i];
            break;
        }
        ans = a[i];
    }
    printf("%lld\n",ans);
    return 0;
}
相关标签: upc训练

上一篇:

下一篇: