17995 Stupid thief 组合数学
17995 Stupid thief
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
A stupid thief has just discovered the treasure in a cave. There are N bottles filled with gold coins.
Because of darkness, he can't see the exact number of coins in each bottle. He only knows the range of the coins’ number in each bottle.
The lower bound of i-th bottle is low[i] and the upper bound is up[i].
Now, He decides to take some of the bottles( at least one bottle) . He wants to know how many kinds of possible coins’ number he would take.
输入格式
The input will contain multiple cases.
The first line is a integer T, the number of test cases,at most 100 cases.
Then T cases follow.
The first line of each case, is an integer N (1<=N<=15), that represents the number of bottles.
Then N lines follow, each contains two integers low[i] and up[i] (1<=low[i]<=up[i]<=1000000), that represents the i-th bottle’s lower bound and upper bound.
输出格式
For each test case, print the answer in a single line, which is the number of possible coins’ number he would take.
输入样例
3
1
10 15
2
3 5
4 5
3
2 2
3 5
4 8
输出样例
6
7
14
提示
In the first sample, the possible coin number is 10,11,12,13,14,15;
In the second sample,the possible coin number is 3,4,5,7,8,9,10;
In the three sample,the possible coin number is the range [2,15];
来源
Farmer
http://acm.scau.edu.cn:8000/uoj/mainMenu.html
给定N个区间,N <= 15,然后每个区间就是[L, R]这个范围,要求你任取x个区间,相加后得到的数字有多少种不同的结果。
考虑只选一个区间,那么数字就是[L, R]
选两个的话,[L[1], R[1]] 和 [L[2], R[2]]能得到的结果就是[L[1] + L[2], R[1] + R[2]]
因为区间的数字是连续的,所以意思就是选取最小的和最小的相加就是下界,最大的和最大的相加就是上界。
那么可以暴力枚举所有不同的组合,得到2^n - 1个范围,要对这些范围进行去重即可。
去重就是
[1, 2]和[1, 10]的,算作[1, 10]、因为问的只是种类嘛。
然后首先对L排序,再合并。
保证L最小后,区间合并的概率最大,也是最优。
排序R的话,会有bug
比如排序完后是
1, 2
3, 3
1, 10
等。
数据
3
1 2
3 3
1 10
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = + ;
struct node {
LL L, R;
bool operator < (const struct node & rhs) const {
return L < rhs.L;
}
}query[ << maxn], b[maxn];
int slc[maxn];
void work() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%lld%lld", &b[i].L, &b[i].R);
}
int end = ( << n) - ;
int len;
int lenq = ;
for (int i = ; i <= end; ++i) {
len = ;
for (int j = ; j <= n; ++j) {
if (( << (j - )) & (i)) {
slc[++len] = j;
}
}
LL mi = ;
LL mx = ;
for (int j = ; j <= len; ++j) {
mi += b[slc[j]].L;
mx += b[slc[j]].R;
if (mx < ) while();
}
++lenq;
query[lenq].L = mi;
query[lenq].R = mx;
}
sort(query + , query + + lenq);
query[lenq + ].L = query[lenq + ].R = -;
lenq++;
LL ans = ;
LL L = query[].L;
LL R = query[].R;
// for (int i = 1; i <= lenq; ++i) {
// cout << query[i].L << " " << query[i].R << endl;
// }
for (int i = ; i <= lenq; ++i) {
if (i == lenq) {
ans += R - L + ;
break;
}
if (R >= query[i].L) {
R = max(R, query[i].R);
} else {
ans += R - L + ;
R = query[i].R;
L = query[i].L;
}
}
cout << ans << endl;
} int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
17995 Stupid thief 组合数学的更多相关文章
- ARC120F Wine Thief (组合数学)
题面 有一个长为 N N N 的序列,相邻的两个数中只能选一个,总共选 k k k 个数,一种方案的价值为选的 k k k 个数的和,问所有合法方案的价值总和,答案对 998244353 取模. 1 ...
- codeforces 632+ E. Thief in a Shop
E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- Codeforces632E Thief in a Shop(NTT + 快速幂)
题目 Source http://codeforces.com/contest/632/problem/E Description A thief made his way to a shop. As ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- 组合数学or not ---- n选k有重
模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- uestc1888 Birthday Party 组合数学,乘法原理
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25539#problem/G 题目意思: 有n个人,每个人有一个礼物,每个人能拿 ...
- UVA 11076 Add Again 计算对答案的贡献+组合数学
A pair of numbers has a unique LCM but a single number can be the LCM of more than one possiblepairs ...
- POJ3252——Round Number(组合数学)
Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...
随机推荐
- linux应用之vsftp服务的安装及配置(centos)
1.centos中vsftp服务的安装 方法1:rpm方式 #rpm –ivh vsftpd-2.0.5-10.el5.i386.rpm 安装rpm程序包(网上下载的rpm包) 方法2:yum方式 ...
- 普通用户Mysql 5.6.13 主从,主主及nagios的mysql slave监控
Master:192.168.209.19 Slave:192.168.209.20 mysql版本:mysql5.6.13 1. 以root身份创建普通用户,如mysql,并创建mysql安装目录: ...
- sparkContext之一:sparkContext的初始化分析
Spark源码学习:sparkContext的初始化分析 spark可以运行在本地模式local下,可以运行在yarn和standalone模式下,但是本地程序是通过什么渠道和这些集群交互的呢?那就是 ...
- OA系统
当用户登录时,根据用户名让他去查找用户的ID,编号,角色,权限,部门信息,等信息查找出来,用户表和角色表是一个一对多的关系,角色和权限也是一个一对多的关系,所以总共加起来有五张表,获取权限是通过用户名 ...
- Hibernate的session.createSQLQuery的几种查询方式
当我们用HQL进行子查询的时候,如select * from Tree where pid in (select id from Tree,此时HIBERANTE就会报错,说什么*号错误之类的.但如果 ...
- 【225】ArcEngine 实现要素添加 & 删除
参考:ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 删除要素 //添加图层,显示在最上面 axMapControl1.AddShapeFile(@"D:\01-业 ...
- A - Toy Cars
Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Little ...
- humans.txt学习理解
可以通过以下链接访问到Google的humans.txt https://www.google.com/humans.txt 百度上有关于humans.txt的介绍 http://baike.baid ...
- python3 封装之property 多态 绑定方法classmethod 与 非绑定方法 staticmethod
property 特性 什么是特性property property 是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值 例如 BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而 ...
- NDK环境搭建(Native Code的编译,不需要Cygwin)
分类: android2013-06-21 15:49 475人阅读 评论(0) 收藏 举报 Android NDK 目录(?)[-] System and Software Requirements ...