2022“杭电杯” 中国大学生算法设计超级联赛(10)1 4题解

本文解析了两道算法竞赛题目,1001-WinnerPrediction关注比赛策略以使1号玩家可能成为最高分者,利用网络流解决;1004-AverageReplacement探讨点权更新问题,通过连通分量和度数分析得出最终点权。

1001-Winner Prediction

题目大意:
一场比赛两个人之间进行,赢的人加一分,目前已知一些结束比赛的结果,还剩下若干场没有进行的比赛,且每场比赛的两个玩家已知。问1号玩家是否有可能成为分数最高的玩家(并列也算)。

思路:
一开始想的是贪心,未开始的比赛,如果有1号玩家参与,就让1号玩家赢,否则每次选一个分数最高的玩家,在他的所有比赛中选一场对手分数最低的比赛,让分数低的玩家赢。但是这样的贪心无法证明是正确的。
后来也想过用网络流,但是因为太久没用过了,有些生疏,没有把图建起来。赛后看题解果然也是用网络流做的。
建图的方式:
源点向每场比赛连一条容量为1的边。
每场比赛向两位选手各连一条容量为1的边。
每位选手向汇点连一条边,容量为1号玩家分数 - 自己当前的分数。

然后套板子跑最大流即可。如果汇点的流量为比赛的场数,说明有解。

AC代码:

#include <bits/stdc++.h>
#define M 20005
#define N 2005
#define mem(a, v) memset(a, v, sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
struct edge
{
   
   
    int to, next;
    int cap;
} e[M];
int head[N], ecnt = 1;
int dep[N], cur[N], S, T, tot;
void add(int u, int v, int cap)
{
   
   
    e[++ecnt] = edge{
   
   v, head[u], cap};
    head[u] = ecnt;
    e[++ecnt] = edge{
   
   u, head[v], 0};
    head[v] = ecnt;
}
bool bfs()
{
   
   
    for (int i = 1; i <= tot; i++)
        dep[i] = 0, cur[i] = head[i];
    dep[S] = 1;
    queue<int> q;
    q.push(S);
    while (q.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值