J

题意:
就是有两个鸽王,每个鸽王有自己的鸽子手下,两个鸽王的鸽子手下之间会有连边,如果一个鸽王的手下之间有连边,那么这两个小鸽子就会飞走,现在问你在不让鸽子飞走的情况下还能加多少条边,加完边后不能有重边和自环。

思考:
刚开始看到这个题感觉挺难的,说的啥呀,实际上仔细分析分析,为什么是2个鸽王,这里就在提示你是二分图,然后如果一个鸽子的手下之间会有连边就会飞走,也就是如果一个点集内有连边就不行。所以只能在两种不同的鸽子间连边。那么就对这个图进行染色,每次染色会出现白色鸽子和黑色鸽子,当然这两个鸽子的颜色也可以互换,因此dfs下来会有多个这样的数对。现在就是对每一个数对选一个数,另一个数是别人的。而且要选的这些数的总和尽可能的接近n/2。因为两个点集之间想有最多的边的话就是两边都是n/2个点。现在就变成了,对于每个数对,我到底该怎么拿,才能满足最终拿的数最接近n/2。看起来像01背包,但是这写数都是数对不是单独的,不能直接01背包,但是仔细观察发现,对于每个数对我先拿较小的那个,当然我也可以拿较大的那个,我先拿较小的,然后把大的和小的差放到数组里。拿完之后,剩下的那些差我都是可以拿的,再从剩下的差里面拿,这样就能用01背包了,尽量让总和是n/2即可。值得注意的是如果直接01背包的话会超时,n*n的复杂度,所以用个二进制优化即可。

代码:

int T,n,m,k;
int va[N];
int vb[N],idx;
int col[N],cnt[5];
int dp[N];vector<int > e[N];void dfs(int now,int color)
{cnt[color]++;col[now] = color;for(auto spot:e[now]){if(!col[spot])dfs(spot,3-color);}
}signed main()
{IOS;cin>>n>>m;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;e[a].pb(b);e[b].pb(a);}int ans = 0;vector<int > v;for(int i=1;i<=n;i++){cnt[1] = 0,cnt[2] = 0;if(!col[i]) dfs(i,1);ans += min(cnt[1],cnt[2]);va[abs(cnt[1]-cnt[2])]++;}for(int i=1;i<=n;i++){int sum = 1;while(sum<=va[i]){vb[++idx] = i*sum;va[i] -= sum;sum *= 2;}if(va[i]) vb[++idx] = i*va[i];}int k = n/2-ans; //ans肯定<=n/2,因为每次拿的是最小的for(int i=1;i<=idx;i++){for(int j=k;j>=vb[i];j--)dp[j] = max(dp[j],dp[j-vb[i]]+vb[i]);}int l = ans+dp[k],r = n-l;int anw = l*r-m; //能构成最多的边,再减去原来就有的边cout<<anw;return 0;
}

总结:
多多思考呀,多多总结。

牛客月赛14-养鸽场-(二分图+转化二进制01背包)相关推荐

  1. 牛客题霸 [将字符串转化为整数] C++题解/答案

    牛客题霸 [将字符串转化为整数] C++题解/答案 题目描述 实现函数 atoi .函数的功能为将字符串转化为整数 提示:仔细思考所有可能的输入情况.这个问题没有给出输入的限制,你需要自己考虑所有可能 ...

  2. 牛客月赛60 F.被抓住的小竹(数学推式子)

    牛客月赛60 F.被抓住的小竹(数学&推式子) 考虑枚举每个区间的贡献. 每个区间内所有的数都作为 x x x一次时的贡献和. 因为要求区间内 ≥ x \ge x ≥x数个数, 那么区间内的数 ...

  3. 山楂(牛客月赛45 )

    山楂 链接:https://ac.nowcoder.com/acm/contest/11222/C 来源:牛客网 众所周知,清楚姐姐最近迷上了一个老年游戏"山楂串"(点进去可以玩) ...

  4. 2018牛客暑假多校A题GPA 01分数规划

    链接:https://www.nowcoder.com/acm/contest/143/A 来源:牛客网 gpa 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语 ...

  5. 牛客月赛42题解【完结】

    目录 冰狱寒岚[简单] 光之屏障[简单] 寒潭烟光[简单] 金蛇狂舞[bfs] 暗灭侵蚀[模拟] 火凤燎原[思维] 冰狱寒岚[简单] https://ac.nowcoder.com/acm/conte ...

  6. 牛客月赛1-(青蛙旅行)-(卡特兰数)

    I 题意: 就是给你n,问你有多少种出栈顺序是合法的,并且1号点不能先出栈. 思考: 很明显的就是卡特兰数,但是范围比较大,所以这里用了线性的卡特兰数.1号点不能先出,假设先去掉一个点,那么还剩n-1 ...

  7. 牛客月赛6_J_洋灰三角_矩阵快速幂

    传送门 题意: a1_11​=1, a2_22​=a1_11​*k+p, a3_33​=a2_22​*k+p , an_nn​=an−1_{n-1}n−1​*k+p, 求Sn_nn​. 思路:高中数学 ...

  8. 牛客月赛思维题使徒袭来

    使徒袭来 参考均值不等式 得到: 3×x1x2x33≤x1+x2+x33\times\sqrt[3]{x_1x_2x_3}\leq x_1+x_2+x_3 3×3x1​x2​x3​​≤x1​+x2​+ ...

  9. 牛客月赛19-皇家烈焰-(多状态dp)

    J 题意: 给你一个字符串 0:这个格子没有烈焰,且其左右两个格子均没有烈焰 1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰 2:这个格子没有烈焰,且其左右两个格子中均有烈焰 *:这个格子有烈焰 ...

  10. 牛客月赛 44 补题题解

    目录 A-深渊水妖 B-顽皮恶魔 C-绝命沙虫 D-丛林木马 E-变异蛮牛 F-幽暗统领 总结 大佬题解 记录第二次比赛的题解 没想到学了一年半算法之后,还有一场比赛会爆0,打击很大,继续努力 比赛传 ...

最新文章

  1. 推荐7款冷门但是非常值得推荐的windows软件
  2. 在linux中安装nginx
  3. ABAP代码检查的注意事项有哪些
  4. 关于登陆到域的用户,不需要显示登陆界面的问题(aspx)
  5. 【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比
  6. 04-图像的形状绘制
  7. 通过SectionIndexer实现微信通讯录
  8. TIOBE 12 月排行榜:古老的 C 和后起之秀 Kotlin,谁是年度编程语言之王?
  9. wp7检测网络是否可用以及网络开启简单代码段
  10. Shell中的变量替换
  11. MySQL 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1...
  12. 基于Java的贪吃蛇游戏设计(含免费可用源代码)
  13. ESP8266WIFI模块连接原子云及手机APP
  14. 简历在线制作计算机,简历在线生成,在线生成PDF或word格式简历
  15. 栈和队列的一些相同点和不同点
  16. 双曲函数奇偶性_第二百一十二夜:高考押题-双曲函数的性质
  17. fullCalendar获取某一天的日程(event)
  18. 看腻了杨幂,热巴,快来抓取上千张美女图片,古装美女看个够
  19. Win11耗电严重怎么解决 Win11耗电太快教程
  20. 技术资源:国内知名技术网站网址

热门文章

  1. 测试经理必知必会-Kanban和Scrum区别
  2. PR剪辑-电子相册学习笔记
  3. 晨曦 - 江湖一剑客
  4. 最高20天年假,入职即带股票!2021微软校园招聘 | 空中宣讲会倒计时!
  5. 概率论与数理统计学习笔记——第十八讲——二元随机变量分布函数、边际分布函数及条件分布函数
  6. SSDT inlineHook
  7. LeetCode1619删除某些元素后的数组均值(java)
  8. JZOJ-senior-3502. 【NOIP2013模拟11.4B组】方格游戏
  9. MATLAB工具箱——Classification Learner使用
  10. 外部中断控制LED灯开关