首页 > 其他分享 >题解:SP7973 ACPC10E - Sometimes, a penalty is good!

题解:SP7973 ACPC10E - Sometimes, a penalty is good!

时间:2024-10-02 17:49:30浏览次数:14  
标签:good cdot 题解 Sometimes long teams 队伍 newteams lld

比较简单的一道数学题。

思路:

  1. 计算小组赛的比赛总数。
long long stage1 = G * T * (T-1) / 2;

每组有 \(T\) 个队伍,每个队伍都需要与其他 \(T-1\) 个队伍比赛,共有 \(T\cdot(T-1)\) 场比赛。共有 \(G\) 组,因此小组赛总比赛数为 \(\frac{G\cdot T\cdot(T-1)}{2}\)。

  1. 计算进入淘汰赛的队伍总数。
long long teams = G * A + D;

小组赛每组晋级 \(A\) 支队伍,共 \(G\cdot A\) 支队伍,再加上 \(D\) 支直接晋级的队伍,总数为 \(G\cdot A+D\)。

  1. 计算晋级淘汰赛的队伍数调整到最接近的2的幂。
long long newteams = teams == 1 ? 1 : 1ll << (64 - __builtin_clzll(teams - 1));
  • teams 为 \(1\) 时,newteams 也设为 \(1\)。
  • 否则,通过位操作找到大于等于 teams 的最小 \(2\) 的幂。
  • __builtin_clzll(x) 是 GCC 提供的一个内置函数,用于计算一个 long long 类型的数从最高有效位到第一个 1 之间的零的数量。
  • 1ll << (64 - __builtin_clzll(teams - 1)) 通过左移操作计算大于等于 teams 的最小 \(2\) 的幂。

代码:

#include<bits/stdc++.h>
#define wrhlovezcx true
using namespace std;
int main() {
    while(wrhlovezcx){
        long long G,T,A,D;
        scanf("%lld %lld %lld %lld",&G,&T,&A,&D);
        if (G==-1) return 0;
        printf("%lld*%lld/%lld+%lld=",G,A,T,D);
        long long stage1=G*T*(T-1)/2;
        long long teams=G*A+D;
        long long newteams=teams==1?1:1ll<<(64-__builtin_clzll(teams-1));
        printf("%lld+%lld\n",stage1+newteams-1,newteams-teams);
    }
}

标签:good,cdot,题解,Sometimes,long,teams,队伍,newteams,lld
From: https://www.cnblogs.com/cly312/p/18444913

相关文章