题目

数轴上有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. 怎么解决Failed to load the JNI shared library

    怎么解决Failed to load the JNIshared library   解决Failed to load the JNIshared library唯一的方法就是重新安装eclipse, ...

  2. [TJOI2012]防御

    https://www.zybuluo.com/ysner/note/1332539 题面 戳我 解析 一道挺棒棒的线段树. 显然一次伤害到来时我们要先看看区间内哪些点的护甲没了. 这个可以通过维护区 ...

  3. 浅谈getAttribute兼容性

    最近终于证实tag.setAttribute("style", "color:#000;");在IE7中不起作用.于是百度了一些解决办法. IE的setAttr ...

  4. linux以行为单位进行读写操作

    1 gets/fgets函数 char* fgets(char *restrict buf,int n,FILE *restrict fp) 参数1:存放读入串的缓冲区 参数2:表示读入的字符个数,最 ...

  5. Codeforces - 346A - Alice and Bob - 简单数论

    http://codeforces.com/problemset/problem/346/A 观察了一下,猜测和他们的最大公因数有关,除以最大公因数前后结果是不会变的. 那么怎么证明一定是有n轮呢?我 ...

  6. Codeforces687A【未完继续....】

    http://codeforces.com/problemset/problem/687/A

  7. 关于Page翻页效果, PageViewConrtoller

    Page View Controllers你使用一个page view controller用page by page的方式来展示内容.一个page view controller管理一个self-c ...

  8. 7天学完Java基础之5/7

    接口 接口就是一种公共的规范标准 是一种引用数据类型 定义格式 public interface 接口名称{} java7 中接口可以包含常量,抽象方法:Java8 还可以额外包含默认方法,静态方法: ...

  9. windows虚拟机下 安装docker 踩过的坑

    首先,你的是win7.8还是win10 windows对docker兼容也是最近的事,所以win7.8的话,安装docker是要用工具箱的,不过官方给了下载. 国内话的可以通过,阿里镜像,或者清华镜像 ...

  10. 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业

    demo地址:ABP.WindowsService 该系列文章启发自 How to: Create a Windows Service that schedules jobs, logs and is ...