3900: 交换茸角

Description

动物园里有 n 头麋鹿。每头麋鹿有两支茸角,每支茸角有一个重量。然而,一旦某头麋鹿上
两支茸角的重量之差过大,这头麋鹿就会失去平衡摔倒。为了不然这种悲剧发生,动物园院长决
定交换某些茸角,使得任意一头麋鹿的两角重量差不超过 c。然而,交换两支茸角十分麻烦,不
仅因为茸角需要多个人来搬运,而且会给麋鹿造成痛苦。因此,你需要计算出最少交换次数,使
得任意一头麋鹿的两角重量差不超过 c。
注意,交换两支茸角只能在两头麋鹿之间进行。因为交换同一头麋鹿的两支角是没有意义的。

Input

第一行为整数 n,c。接下来 n 行,每行两个整数,分别表示一开始每头麋鹿的两角重量。

Output

一个数,即最少交换次数。如果无论如何也不能使每头麋鹿平衡,输出 -1。

Sample Input

3 0
3 3
2 5
2 5

Sample Output

1

HINT

对于 100% 的数据,n <= 16, c <= 1000000, 每支茸角重量不超过 1000000。

网上都没人写题解,还是自己写一发吧。。。

怎么说呢,n<=16是一个突破口,我们肯定要往状压上想。。

刚开始我是直接枚举状态中哪两个互相交换,但最后发现有反例,比如:

3 1

1 3

2 4

3 5

一头鹿可以进行好几次交换。。

然后改变思路,发现这题和某次的topcoder的juice有点像,先预处理出i状态下让每一头鹿进行交换的最小交换次数,如果可行的话,那么答案就是鹿的个数减1(好好想想),接下来就很简单了。。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n,m,i,j,k,p,c[40],a[20],b[20],f[(1<<16)+5];
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
for(i=1;i<(1<<n);i++)
{
k=0;p=0;
for(j=0;(1<<j)<=i;j++)
if(1<<j&i)
{
if(abs(a[j+1]-b[j+1])>m) p=1;
k++;
c[k]=a[j+1];
k++;
c[k]=b[j+1];
}
if(p==0) f[i]=0;else
{
sort(c+1,c+k+1);
p=0;
for(j=1;j<=k;j+=2)
if(c[j+1]-c[j]>m) {p=1;break;}
if(p==1) f[i]=1e9;else f[i]=k/2-1;
}
}
for(i=1;i<(1<<n);i++)
for(j=(i-1)&i;j>0;j=(j-1)&i)
f[i]=min(f[i],f[j]+f[i^j]);
if(f[(1<<n)-1]==1e9) cout<<"-1";else cout<<f[(1<<n)-1];
return 0;
}

  

bzoj 3900: 交换茸角的更多相关文章

  1. bzoj千题计划240:bzoj3900: 交换茸角

    http://www.lydsy.com/JudgeOnline/problem.php?id=3900 dp[i]表示让状态为i的鹿满足要求的最少交换次数 不能枚举两头鹿交换,因为一头鹿可能交换多次 ...

  2. bzoj3900 交换茸角

    题目链接 思路 看到n比较小,可以状压. 可以先考虑什么情况下会无法平衡.显然就是排完序之后两两相邻的不能满足小于等于c的限制. 状态.用f[i]来表示i集合中的鹿完成交换所需要的次数. 预处理.无法 ...

  3. BZOJ 2668 交换棋子(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...

  4. [BZOJ 2668] 交换棋子

    Link: BZOJ 2668 传送门 Solution: 重点在于对于每条转移路径:首尾算一次,中间节点算两次 可以一点拆三点,将原流量拆成入流量和出流量 但其实也可以就拆两点,分前后是否是一首尾点 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. DP&图论 DAY 3 上午

    DP&图论  DAY 3  上午 状态压缩dp >状态压缩dp ◦状态压缩是设计dp状态的一种方式.◦当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少是,可以将多维 ...

  7. 状态压缩dp相关

    状态压缩dp 状态压缩是设计dp状态的一种方式. 当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总 量很少是,可以将多维状态压缩为一维来记录. 这种题目最明显的特征就是: 都存在某一给 ...

  8. 状压dp(8.8上午)

    神马是状态压缩? 就是当普通dp的每一维表示的状态非常少的时候,可以压缩成一维来表示 如果m==8 dp[i][0/1][0/1]......[0/1] 压缩一下 dp[i][s]表示到了第i行,状态 ...

  9. DAY 3 上午

    状压DP 状态压缩dp 状态压缩是设计dp状态的一种方式. 当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少时,可以将多维状态压缩为一维来记录. 这种题目最明显的特征就是:都存在 ...

随机推荐

  1. hdu 1599 find the mincost route (最小环与floyd算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...

  2. python进行机器学习(三)之模型选择与构建

    Scikit-Learn库已经实现了所有基本机器学习的算法,可以直接调用里面库进行模型构建. 一.逻辑回归 大多数情况下被用来解决分类问题(二元分类),但多类的分类(所谓的一对多方法)也适用.这个算法 ...

  3. 自动化测试===Httprunner测试框架介绍

    项目地址: https://github.com/HttpRunner/HttpRunner 中文手册: http://cn.httprunner.org/ 首先是环境搭建: pip install ...

  4. 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)

    网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...

  5. webapi-2 接口参数

    1. 实例 using System; using System.Collections.Generic; using System.Linq; using System.Net; using Sys ...

  6. java8新特性视频、spring4.0视频讲解,javaee基础知识讲解等网址汇总

    1.http://ke.atguigu.com/     海量视频首页 2.http://ke.atguigu.com/course/56    java8新特性学习地址

  7. hadoop-Rpc使用实例

    代码:https://github.com/xufeng79x/hadoop-common-rpc-demo 1. 简介 hadoop中使用rpc机制来进行分布式进程间的通信,被封装进了hadoop- ...

  8. Cent os FTP配置

    原文:http://www.aicoffees.com/itshare/412261137.html

  9. div左右自适应高度一致

    <div style="width:300px;"> <div id="Left" style="float:left;" ...

  10. JPA注解一对多报Could not determine type for: java.util.List错误

    在原来的项目上加新功能,启动后报Caused by: org.hibernate.MappingException: Could not determine type for: java.util.L ...