首页 > 其他分享 >2023.04.14 定时测试随笔 T1

2023.04.14 定时测试随笔 T1

时间:2023-04-14 18:58:17浏览次数:53  
标签:group 14 int 2023.04 T1 fa maxn dp

T1 P2170 选学霸

传送门:洛谷P2170

本题考察的是并查集优化背包DP,所以我们通过并查集将 \(n\) 个点变成 \(group\) 个连通块,那么每个连通块里面的点要么都选要么都不选,状态 \(dp[i]\) 定义为可以选 \(i\) 个学霸且不会抗议,算出所有可能的结果,再枚举 \(1\) ~ \(n\) ,求出最接近 \(m\) 的可能的值;


贴代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e4 + 5;
int n, m, k, group, dp[maxn], fa[maxn], siz[maxn], f[maxn];

int Find(int x) {
    if (x == fa[x]) return fa[x];
    return fa[x] = Find(fa[x]);//很重要的路径压缩
}

void read() {
    scanf("%d%d%d", &n, &m, &k);
    group = n;
    for (int i = 1; i <= n; ++ i)
        fa[i] = i, siz[i] = 1;
    for (int i = 1, u, v; i <= k; ++ i) {
        scanf("%d%d", &u, &v);
        int fu = Find(u), fv = Find(v);
        if (fu != fv) {
            group --;
            fa[fu] = fv;
            siz[fv] += siz[fu];
        }
    }
    dp[0] = dp[n] = 1;
    for (int i = 1; i <= n; ++ i) {
        int fi = Find(i);
        if (f[fi]) continue ;
        f[fi] = 1;
        for (int j = n - siz[fi]; j >= 0; -- j) {
            if (dp[j]) dp[j + siz[fi]] = 1;
        }
    }
    int minl = 1e9 + 7, minr = 1e9 + 7;
    for (int i = 0; i <= m; ++ i)
        if (dp[i]) minl = min(minl, m - i);
    for (int i = m; i <= n; ++ i)
        if (dp[i]) minr = min(minr, i - m);
    if (minl == minr) printf("%d\n", m - minl);
    else if (minr < minl) printf("%d\n", m + minr);
    else printf("%d\n", m - minl);
}

int main() {
    read();
    return 0;
}

标签:group,14,int,2023.04,T1,fa,maxn,dp
From: https://www.cnblogs.com/florence25/p/17319312.html

相关文章

  • 2023年4月14日周五
    计划完成初稿前两部分,学习CRM项目,熟悉项目的代码结构背单词记得执行09点13分  写初稿11点19分  完成论文初稿第一二章11点30分  做页码修改,开始CRM项目学习16点04分  解决新增用户16点13分  解决删除用户记录已解决问题想法GPT学习路线Java基础:......
  • 解决nvm升级node v18.14.0时/lib64/libm.so.6: version 'GLIBC_2.27' not found (requ
    安装v18.14.0时的报错和解决方法1.报错[root@devops03~/.nvm]#nvminstallv18.14.0Downloadingandinstallingnodev18.14.0...Downloadinghttps://npm.taobao.org/mirrors/node/v18.14.0/node-v18.14.0-linux-x64.tar.xz...#######################################......
  • 每日会议20230414
     进度汇报:吕金帅:张博文:自周一起到现在,完成了商品表的数据库的连接,完成了高德地图导航接口的连接,在fragment中嵌入listview展示商品收益和广告收益。遇到的问题是:不知道如何记录数据库记录改变的次数,从而进行商品数量上的变化。赵纪旭: 具体目标:要实现三方数据库的统一,我们......
  • 4.14训练解题报告
    比赛传送门\(\color{white}20230413Tainrnig\)A.IceCave题意:考虑糖豆人的蜂窝迷图中的一层,走过一个正常格子就会变成洞。给定当前地板局面(抽象成\(n\timesm\)矩阵),以及起点和终点,求是否能在终点位置掉到下一层。特殊地,本题不允许停留。起点终点可以相同。\(n,m\le500\)......
  • 2023-04-14 css before after
    before在元素前,after在元素之后,使用:.or::before{width:100px;height:1px;background:#000;display:block;content:'',}.or::after{width:100px;height:1px;background:#00......
  • 2023-04-14 uni-popup 报错:Error in config.errorHandler: "RangeError: Maximum call
    问题描述:首次导入uniapp的uni-popup,在项目中使用时报错,业务场景为:页面渲染完成后显示弹窗。报错:Errorinconfig.errorHandler:"RangeError:Maximumcallstacksizeexceeded"config.errorHandler中的错误:“RangeError:超出了最大调用堆栈大小”页面如下:<uni-popupref="l......
  • (动态规划)剑指 Offer 14- II. 剪绳子 II
    题目描述:给你一根长度为n的绳子,请把绳子剪成整数长度的m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案......
  • 2023-04-14 vue之组件全局注册
    新建一个vue文件,随便写点什么,然后在main.js中引入,如下:xxx.vue:<template><viewclass="container"><viewclass="content">登录窗口</view></view></template><script>exportde......
  • ABC214G/S2OJ1504
    ABC214G/S2OJ1504又是我不会的/hanx做了一天/ng直接做显然是不行的,所以考虑转化题意,对于\(\foralli\),连边\((A_i,B_i)\),现在题意就变成给边染色了,这样统计的就是不合法的,考虑容斥,一个很\(\text{naive}\)的容斥是总数-不合法,发现你根本做不了,所以很容易想到加强限制,让答......
  • 2023.4.14每日会议
    昨天做了什么:完成了对listview的item点击弹出详细信息,完成了图片识别微信支付截图录入遇到了那些问题:相机拍的照片太模糊,图片识别识别不出来今天打算做什么:根据用户消费比例给出消费建议,并且做总支付的图以及各项占比 ......