题目

数轴上有M个点a1、a2、...am,另有一个数列p1、p2、...pn,(1 ≤ pii ≤ M)。

给定d1、d2、...dn,对所有的 i (1 ≤ i ≤ n),已知 |api+1 - api| = di,求M得最少可能值。(1 ≤ n ≤ 25 ,1 ≤ ai ≤ 105)

原题链接:http://codeforces.com/group/gRkn7bDfsN/contest/212299/problem/B

思路

基本思路:枚举 api+1 在 api 的左边或右边,为了降低复杂度,强制第一次选向右(向左也可以)。

思路一:利用二进制+位运算,枚举所有的可能

O(2N-1N)

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int SIZE = ( * ) * + ; //数轴的范围
const int maxn = + ;
int n, d[maxn];
int ans,cnt,vis[SIZE]; void solve()
{
//对剩下m-1个选择进行枚举
for (int i = ; i < ( << (n - )); i++)
{
int v_num = ;
cnt++;
int s = SIZE / + d[];
//for (int i = 0; i < SIZE; i++) vis[i] = 0; //这种标记会导致T
vis[SIZE / ] = cnt;
vis[SIZE / + d[]] = cnt; //强行规定第一次向左走 for (int j = ; j < n - ; j++)
{
if (i & ( << j))
s += d[j + ];
else
s -= d[j + ];
if (vis[s] != cnt)
{
v_num++;
vis[s] = cnt;
}
}
ans = min(ans, v_num);
}
} int main()
{
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d", &d[i]);
ans = n + ; //ans不会超过n+1
cnt = ;
solve();
printf("%d\n", ans);
return ;
}

思路二:DFS尝试遍每一种情况

O(2N-1)

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int SIZE = * * + ; //数轴的范围,SIZE/2相当于原点
const int maxn = + ;
int m, d[maxn];
int vis[SIZE];
int ans; //第cur+1个状态,x位置,顶点数v
void dfs(int cur, int x, int v)
{
if (cur == m)
{
ans = min(ans, v);
return;
}
int net = x + d[cur];
vis[net]++; //不能只用0/1来区分
dfs(cur + , net, v + (vis[net] == ));
vis[net]--; net = x - d[cur];
vis[net]++;
dfs(cur + , net, v + (vis[net] == ));
vis[net]--;
} int main()
{
while (scanf("%d",&m) == && m)
{
memset(vis, , sizeof(vis));
for (int i = ; i < m; i++)
scanf("%d", &d[i]);
ans = m + ; //ans不会超过m+1
vis[SIZE / ] = ;
vis[SIZE / + d[]] = ; //强行规定第一次向有走
dfs(, SIZE / + d[], );
printf("%d\n", ans);
}
return ;
}

Dreamoon and MRT(二元枚举)的更多相关文章

  1. Dreamoon and MRT

    Dreamoon and MRT 题目链接: http://codeforces.com/group/gRkn7bDfsN/contest/212299/problem/B 只需要考虑相对位置,设a0 ...

  2. Codeforces Round #272 (Div. 2) B. Dreamoon and WiFi (暴力二进制枚举)

    题意:给你一个只含\(+\)和\(-\)的字符串,统计它的加减和,然后再给你一个包含\(+,-,?\)的字符串,其中\(?\)可以表示为\(+\)或\(-\),问有多少种情况使得第二个字符串的加减和等 ...

  3. 转载:《TypeScript 中文入门教程》 2、枚举

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 由于第一章节是我翻译的,而且与他的版本不一致,导致第一章节有枚举这部分,而他的第二章节 ...

  4. 1、C#基础:变量、运算符、分支、循环、枚举、数组、方法 <转>

    转自:海盗船长 链接:http://www.cnblogs.com/baidawei/p/4701504.html#3241882 C#..Net以及IDE简介 一.什么是.Net? .Net指 .N ...

  5. LA 2402 (枚举) Fishnet

    题意: 正方形四个边界上分别有n个点,将其划分为(n+1)2个四边形,求四边形面积的最大值. 分析: 因为n的规模很小,所以可以二重循环枚举求最大值. 求直线(a, 0) (b, 0) 和直线(0, ...

  6. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  7. BZOJ 1688: Disease Manangement (子集枚举)

    Disease Manangement Q - 枚举子集 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &a ...

  8. C# 语言规范_版本5.0 (第14章 枚举)

    1. 枚举 枚举类型 (enum type) 是一种独特的值类型(第 4.1 节),它用于声明一组命名的常量. 下面的示例 enum Color { Red, Green, Blue } 声明一个名为 ...

  9. TypeScript入门-枚举、类型推论

    枚举 使用枚举可以定义一些具有名字的数字常量,和在C语言中一样都是使用关键字enum enum Direction { Up = 1, Down = 1<<2, Left, Right } ...

随机推荐

  1. bzoj1089严格n元树——DP+高精度

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1089 f[d]为深度小于等于d的树的个数: 从根节点出发,有n个子树,乘法原理可以得到 f[ ...

  2. HAOI2012高速公路——子区间计算

    题目:https://www.luogu.org/problemnew/show/P2221 似乎按点来算贡献很方便,但我抱住一篇没有这样的题解磕了两天... 以下转载: 题意:维护一段数列 支持区间 ...

  3. 微信小程序开发之https从无到有

    本篇不讲什么是https,什么是SSL,什么是nginx 想了解这些的请绕道,相信有很多优秀的文章会告诉你. 本篇要讲的在最短的时间内,让你的网站从http升级到https. 开始教程前再说一句:ht ...

  4. CMake命令之list

    用途:提供一些列表操作 list(LENGTH <list><output variable>)  list(GET <list> <elementindex ...

  5. HDU 1270 小希的数表 (暴力枚举+数学)

    题意:... 析:我们可以知道,a1+a2=b1,那么我们可以枚举a1,那么a2就有了,并且a1+a3=b2,所以a3就有了,我们再从把里面的剩下的数两两相加,并从b数组中去掉, 那么剩下的最小的就是 ...

  6. Mac系统下源码编译安装MySQL 5.7.17

    1.下载并解压到:/Users/xiechunping/Softwares/mysql-5.7.17下载地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MyS ...

  7. 洛谷 P3960 列队【线段树】

    用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 ...

  8. CF126B Password【KMP】By cellur925

    题目传送门 其实$Chemist$在之前写了非常棒的题解! 我长话短说,补充两句. “那么当$next[n]$>$max$时显然不能将$next[n]$作为最长子串的长度”这句话其实在说,因为一 ...

  9. zabbix数据库存储和性能

    1 基本认识 1.1 history zabbix默认每分钟采集一次item的数据,然后会存入history表中.主机越多,需要采集的item值就越多,history表的增长速度就越快. 在histo ...

  10. python实现选择排序

    list_1 = [] #先建一个空链表 print('输入排序个数:') n = int(input()) #接收输入个数 for i in range(n): a = input() list_1 ...