bzoj3900 交换茸角
思路
看到n比较小,可以状压。
可以先考虑什么情况下会无法平衡。显然就是排完序之后两两相邻的不能满足小于等于c的限制。
状态。用f[i]来表示i集合中的鹿完成交换所需要的次数。
预处理。无法平衡的肯定就是INF。已经平衡的是0。其他的先暂设为k-1(k是i集合中鹿的个数)。
然后转移。每个集合可以由他的子集转移过来。即$$f[i]=min(f[i],f[j] + f[i \oplus j])$$
其中j为i的子集
代码
/*
* @Author: wxyww
* @Date: 2019-01-19 14:17:57
* @Last Modified time: 2019-01-19 14:30:13
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int INF = 1e9 + 7,N = 100000 + 10;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,c,tmp[N];
int a[20],b[20],tt[100];
int pd(int x) {
int js = 0;
int bz = 0;
for(int i = 1;i <= n;++i) {
if(1 << (i - 1) & x) {
if(abs(a[i] - b[i]) > c) bz = 1;
tt[++js] = a[i];
tt[++js] = b[i];
}
}
if(bz == 0) return 0;
sort(tt + 1,tt + js + 1);
for(int i = 1;i <= js;i += 2) {
if(tt[i + 1] - tt[i] > c) return INF;
}
return js / 2 - 1;
}
int f[N];
int main() {
n = read(),c = read();
for(int i = 1;i <= n;++i) a[i] = read(),b[i] = read();
int K = (1 << n) - 1;
if(pd(K) == INF) {
puts("-1");
return 0;
}
for(int i = 1;i <= K;++i) {
f[i] = pd(i);
}
for(int i = 1;i <= K;++i) {
for(int j = i;j > 0;j = (j - 1) & i) {
f[i] = min(f[i],f[j] + f[i ^ j]);
}
}
cout<<f[K];
return 0;
}
bzoj3900 交换茸角的更多相关文章
- bzoj千题计划240:bzoj3900: 交换茸角
http://www.lydsy.com/JudgeOnline/problem.php?id=3900 dp[i]表示让状态为i的鹿满足要求的最少交换次数 不能枚举两头鹿交换,因为一头鹿可能交换多次 ...
- bzoj 3900: 交换茸角
3900: 交换茸角 Description 动物园里有 n 头麋鹿.每头麋鹿有两支茸角,每支茸角有一个重量.然而,一旦某头麋鹿上 两支茸角的重量之差过大,这头麋鹿就会失去平衡摔倒.为了不然这种悲剧发 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- DP&图论 DAY 3 上午
DP&图论 DAY 3 上午 状态压缩dp >状态压缩dp ◦状态压缩是设计dp状态的一种方式.◦当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少是,可以将多维 ...
- 状态压缩dp相关
状态压缩dp 状态压缩是设计dp状态的一种方式. 当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总 量很少是,可以将多维状态压缩为一维来记录. 这种题目最明显的特征就是: 都存在某一给 ...
- 状压dp(8.8上午)
神马是状态压缩? 就是当普通dp的每一维表示的状态非常少的时候,可以压缩成一维来表示 如果m==8 dp[i][0/1][0/1]......[0/1] 压缩一下 dp[i][s]表示到了第i行,状态 ...
- DAY 3 上午
状压DP 状态压缩dp 状态压缩是设计dp状态的一种方式. 当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少时,可以将多维状态压缩为一维来记录. 这种题目最明显的特征就是:都存在 ...
- A Game of Thrones(1) - Bran
The morning had dawned clear and cold, with a crispness(易碎:清新) that hinted(暗示:示意) at the end of summ ...
- 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)
日常英语---十一.MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider) 一.总结 一句话总结:骑着鹰的快速飞行的恶魔,进入地图后跟着你. ...
随机推荐
- C# Note14: Editable WPF ListView
(1)https://stackoverflow.com/questions/5652527/editable-wpf-listview (2)How to: Create a ListView wi ...
- liunx 运维知识一部分
一 克隆虚拟机 大家都需要做的克隆虚拟机,在克隆虚拟机之前,需要把网卡源的UUID和Mac地址全部删除掉.不然相同会冲突使用不了. 删除UUID跟Mac的操作步骤如下: cd /etc/sysc ...
- redis设置防火墙的问题
Linux 下载安装配置Redis完整步骤 安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2. ...
- python 钉钉机器人发送消息
import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...
- Python:matplotlib绘制散点图
与线型图类似的是,散点图也是一个个点集构成的.但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来. 用plt.plot画散点图 奇怪,代码和前面的例子差不多,为什么这里显示的却是散 ...
- linux硬盘的分区、格式化、挂载以及LVM
linux硬盘的分区.格式化.挂载以及LVM 多块硬盘的组合: 硬盘分两种:ide和scsi. ide硬盘: /dev/hda 第一块IDE硬盘 /dev/hdb 第二块IDE硬盘 ... /de ...
- Python——进程通信之间数据共享
from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acquire() dic['count'] -= ...
- Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项
貌似已经半年多没写一篇帖子了,充分的说明要么老总一天折腾的让人心齐疲惫,没心情去写:要么另外一种可能就是自己不思进取,说白了就是懒.好在这种状态在今天被打破了.MoNey加油. 众所周知,想在Enti ...
- ES 6 系列 - Promise
一.含义 是异步编程的一种解决方案,es 6 将其变成了标准. 简单的说是一个容器,里面保存了某个未来才会结束的事件(通常是一个异步操作)的结果.语法上, Promise 是一个对象,从它可以获取异步 ...
- mpi4python
转载:https://zhuanlan.zhihu.com/p/25332041 前言 在高性能计算的项目中我们通常都会使用效率更高的编译型的语言例如C.C++.Fortran等,但是由于Python ...