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

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

时间:2024-10-02 17:49:30浏览次数:10  
标签: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

相关文章

  • 题解:SP10242 ACPC11D - Dice on a Board
    思路递归生成所有的可能的筛子朝向,用DFS标记所有可达的位置,用dijkstra计算从起始位置到目标位置的最优路径,并确定在移动过程中能够获得的最大分数。generate函数generate用于生成所有可能的骰子朝向排列,\(mask\)作为参数,用于表示哪些数字已经被使用。使用二进制压缩。......
  • 题解:P9954 [USACO20OPEN] Cowntact Tracing B
    考虑暴力。枚举让每头牛都当一次“零号病人”和\(K\)的所有组合,模拟感染的过程,检查得出的病人是否和给出的一样即可。代码:#include<bits/stdc++.h>usingnamespacestd;boolinfectedd[101];intN,cowx[251],cowy[251];boolcheck(intpatient_zero,intK){ boolinfect......
  • 题解:SP9934 ALICE - Alice and Bob
    状态表示:使用两个变量来表示当前游戏的状态:\(a\)表示包含\(1\)个石子的堆的数量,\(b\)表示包含多于\(1\)个石子的堆的可操作次数。游戏策略:从包含多个石子的堆中取走一个石子,这会减少\(b\)。从包含\(1\)个石子的堆中取走一个石子,这会减少\(a\)。合......
  • 题解:P9939 [USACO21OPEN] Acowdemia III B
    考虑贪心。遍历每只奶牛:如果它最多与一头奶牛相邻,那么什么都不会发生。如果它与两头以上的奶牛相邻,那么它与两侧的两头奶牛相邻。将答案递增\(1\)。否则,如果正好有两头相邻的奶牛,我们就把它们配对。也就是说,将这对奶牛插入一组。代码:#include<bits/stdc++.h>usingname......
  • 题解:UVA1500 Alice and Bob
    状态表示:使用两个变量来表示当前游戏的状态:\(a\)表示包含\(1\)个石子的堆的数量,\(b\)表示包含多于\(1\)个石子的堆的可操作次数。游戏策略:从包含多个石子的堆中取走一个石子,这会减少\(b\)。从包含\(1\)个石子的堆中取走一个石子,这会减少\(a\)。合......
  • 题解:P9788 [ROIR 2020 Day2] 区域规划
    法1枚举\(a,b,c\),考虑到\(c\)的最小值为\(\max(1,\frac{(a\cdotb−n)}{b})\),所以直接剪枝即可通过。代码:#include<bits/stdc++.h>usingnamespacestd;intans,n,m;intmain(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(i......
  • 题解:UVA124 Following Orders
    考虑深搜和拓扑排序。从入度为零的节点开始,逐步添加到当前的排列结果中,并在每一步递减相邻节点的入度。如果某个节点的入度变为零,就递归地将其添加到当前排列中。一旦达到排列的叶节点,就存储起来,并按字典顺序排序。代码:#include<bits/stdc++.h>usingnamespacestd;voidread......
  • 题解:UVA117 The Postal Worker Rings Once
    此题要求我们求欧拉回路的长度。使用Floyd算法计算图中任意两点之间的最短路径,对于度数为奇数的路口(最多有两个),找到它们之间的最短路径并将其加入总路径长度中。代码:#include<bits/stdc++.h>#defineINF1e8usingnamespacestd;intdegree[26];intpath[26][26];intal......
  • 题解:SP15553 STC00 - Hamsters
    首先,通过预处理计算每个名字的哈希值,然后利用哈希检查名字之间的最长公共前缀,从而确定从一个名字转移到另一个名字的最小代价。使用倍增动态规划计算转移的最小成本,\(f_{t,i,j}\)表示从名字\(i\)经过\(2^t\)步转移到名字\(j\)的最小代价,最后通过位运算处理\(M\)次转移的......
  • 题解:AT_abc373_d [ABC373D] Hidden Weights
    可以发现一个性质:对于图的每个连通分量,一旦在其中任何顶点上的值固定,则所有写入的值都是确定的。我们可以逐个DFS每个连通分量,按照题目的要求给每个点赋值,初始搜索的点值设成\(0\)即可。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;......