CodeForces - 95E: Lucky Country (多重背包)
pro:给定N个点,M条边,现在你要给一些连通块加边,使得至少存在一个连通块的大小是由4和7组成的数字。问至少加边数量。
sol: 看似一个很难的题目。 首先不要想太难了,还是应该想能不能用背包做。 我们把块的大小相同的分到一组,就可以分组背包了。 然后注意到组别的大小其实不会太大,因为1*1+2*2+3*3+4*4+x*x<=1e5; x是1e2级别的。 所以做100次多重背包。 总的复杂度也才O(100*N*K),K是个比较小的常数,真正的复杂度小于这个;
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int fa[maxn],num[maxn],sum[maxn];
int dp[maxn],N;
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void pack(int v,int now)
{
for(int i=N;i>=v;i--){
dp[i]=min(dp[i-v]+now,dp[i]);
}
}
void solve(int v,int x)
{
int now=;
while(now<x){
pack(v*now,now);
x-=now;
now*=;
}
if(x) pack(v*x,x);
}
bool check(int x){
int tx=x;
while(x){
int t=x%;
if(t!=&&t!=) return false;
x/=;
}
return true;
}
int main()
{
int M,v,u,fu,fv;
scanf("%d%d",&N,&M);
rep(i,,N) num[i]=,fa[i]=i;
rep(i,,M){
scanf("%d%d",&u,&v);
fu=find(u);
fv=find(v);
if(fu!=fv) num[fu]+=num[fv],fa[fv]=fu;
}
rep(i,,N) {
fu=find(i);
if(fu==i) sum[num[fu]]++;
}
rep(i,,N) dp[i]=N+M+;
rep(i,,N)
if(sum[i]) solve(i,sum[i]);
int res=N+M+;
rep(i,,N)
if(check(i)) res=min(dp[i],res);
if(res==N+M+) puts("-1");
else printf("%d\n",res-);
return ;
}
CodeForces - 95E: Lucky Country (多重背包)的更多相关文章
- 95E Lucky Country
传送门 题目大意 如果一个数中不包含除4和7之外的数字则是幸运数.有n个岛屿,通过双向道路连接.这些岛屿被分为几个地区.每个岛属于恰好一个区域,同一区域中的任何两个岛之间存在道路,不同区域的任何两个岛 ...
- Codeforces 106 C 多重背包
题目链接:http://codeforces.com/problemset/problem/106/C 根据题意列出式子,设每种蛋糕做了xi个,则对于每种材料bi*xi<=ai. 对于dough ...
- Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化
https://codeforces.com/contest/1132/problem/E 题意 有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多 ...
- codeforces 755F F. PolandBall and Gifts(贪心+多重背包)
题目链接: F. PolandBall and Gifts time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- Codeforces 755 F. PolandBall and Gifts 多重背包+贪心
F. PolandBall and Gifts It's Christmas time! PolandBall and his friends will be giving themselves ...
- HDU 3591 (完全背包+二进制优化的多重背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...
- HDU_3591_(多重背包+完全背包)
The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
随机推荐
- 033 SSM综合练习09--数据后台管理系统--基于AOP的日志处理
1.数据库与表结构 (1)日志表信息描述sysLog (2)Sql语句 CREATE TABLE sysLog ( id ) DEFAULT SYS_GUID () PRIMARY KEY, visi ...
- SSM学习系列
Spring+SpringMVC+MyBatis Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识 Spring+SpringMVC+MyBatis深入 ...
- SGU 126. Boxes --- 模拟
<传送门> 126. Boxes time limit per test: 0.25 sec. memory limit per test: 4096 KB There are two b ...
- Java开发笔记(一百四十七)通过JDBC管理数据库
前面介绍了如何通过JDBC获取数据库连接,可是Connection对象不能直接执行SQL语句,需要引入Statement报告对象才能操作SQL.Statement对象由Connection的creat ...
- Linux内核--伙伴系统--页释放
本文转载自:http://www.cnblogs.com/tolimit/ 感觉原博分析的不错,借花献佛. ---------------------------------------------- ...
- python学习-36 文件处理b模式
文件处理b模式 1.以2进制的方式读取 f = open('test.txt','rb') #以b模式就不能指定encoding data = f.read() print(data) f.close ...
- for循环与if条件语句的复习运用
鉴于前面学了不少基础了,今天没有学新的内容.boyfriend给我出了几道简单的题目,慢慢的进步中. 1.# 计算1-100之间所有偶数的和 def sum(): sumone = 0 for i i ...
- Js的iframe相关问题,如何判断当前是否在iframe中,iframe和它的父窗口如何通信
一.前言: 在web中,为了丰富我们的内容,往往需要引用其它HTML文件,这时候就需要用到 iframe 标签,本文就主要记录一下使用iframe所需要注意的问题 iframe 所使用的环境(笔者所遇 ...
- Linux Shell/Bash wildcard通配符、元字符、转义符使用
说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: 1 1 2 3 4 [chengmo@localhost ~/shell]$ ls a.txt b.txt ...
- vue-cli + webpack 环境搭建
1.下载nodeJS,官网 https://nodejs.org/en/ . 2.安装nodeJS.安装完成后可以检测node -v 如果版本号的话则正常. 3.安装淘宝镜像.npm install ...