【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑
Time Limit: 10 Sec Memory Limit: 64 MB
[Submit][Status][Discuss]
Description
Input
输入的第一行包含三个用空格分开的整数 N,A,B。
Output
输出一行一个数,表示最小的最终优美度。
Sample Input
8 1 2 1 5 4
Sample Output
将这些雕塑分为 2 组,(8,1,2) 和 (1,5,4),它们的和是 (11) 和 (10),最终优美度是 (11 OR 10)=11。(不难验证,这也是最终优美度的最小值。)
HINT
Main idea
将一个序列分为若干组,使得每组的和OR起来的值最小。
Solution
根据题意,要使最终的答案最小,可以想到利用贪心,从高到低枚举答案的每一位,如果能取0则取0,否则取1。
问题转化为如何判断答案的某一位能否取0,我们考虑用DP解决这个问题。假设当前枚举到第pos位。
令f[i][j]表示前i个数分成j组,显然该位可以填0的条件是:
1.存在k在i前面分了j-1组可行;
2.异或值满足之前已经枚举的相同(保证最小)
3.这一位可以是0。
这样可以过71分,最后一组数据TLE,发现最后一组数据下界固定为1,由于显然发现组数越小越优,可以令g[i]表示令第i位为0的最小组数,如果组数<B则这位可以为0。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=; int n,A,B;
int a[ONE],g[ONE];
bool f[ONE][ONE];
long long Sum[ONE];
long long res;
long long total;
int PD,len; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void PartOne()
{
for(int pos=len;pos>=;pos--)
{
memset(f,,sizeof(f));
f[][]=; for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
for(int k=;k<=i-;k++)
{
total=Sum[i]-Sum[k]; if(f[k][j-] && ((total>>pos)|res)==res && ((total>>(pos-)) & (long long))== )
{
f[i][j]=;
break;
}
} PD=;
for(int i=A;i<=B;i++)
{
PD=f[n][i];
if(PD) break;
}
res<<=;
if(!PD) res|=;
}
} void PartTwo()
{
for(int pos=len;pos>=;pos--)
{
memset(g,,sizeof(g));
g[]=;
for(int i=;i<=n;i++)
for(int k=;k<=i-;k++)
{
total=Sum[i]-Sum[k]; if(((total>>pos)|res)==res && ((total>>(pos-)) & (long long))== )
{
g[i]=min(g[i],g[k]+);
}
} res<<=;
if(g[n]>B) res|=;
} } int main()
{
n=get(); A=get(); B=get();
for(int i=;i<=n;i++)
{
a[i]=get();
Sum[i]=Sum[i-]+a[i];
} total=Sum[n];
while(total)
{
len++;
total>>=;
} if(A!=) PartOne();
else PartTwo(); printf("%lld",res); }
【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]的更多相关文章
- [APIO2015]巴厘岛的雕塑 贪心+DP+特殊数据优化
写了好久.... 刚刚调了一个小时各种对拍,,,,最后发现是多写了一个等号,,,,内心拒绝 表示一开始看真的是各种懵逼啊 在偷听到某位大佬说的从高位开始贪心后发现可做 首先考虑小数据(因为可以乱搞) ...
- [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
[APIO2015]巴厘岛的雕塑 题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...
- bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...
- [BZOJ4069][Apio2015]巴厘岛的雕塑
题目大意 分成 \(x\) 堆,是的每堆的和的异或值最小 分析 这是一道非常简单的数位 \(DP\) 题 基于贪心思想,我们要尽量让最高位的 \(1\) 最小, 因此我们考虑从高位向低位进行枚举,看是 ...
- BZOJ 4069 [Apio2015]巴厘岛的雕塑 ——贪心
自己首先想了一种方法$f(i)$表示前$i$个最小值为多少. 然而发现位运算并不满足局部最优性. 然后我们可以从高到低贪心的判断,使得每一组的和在一个特定的范围之内. 还要特判最后一个Subtask, ...
- APIO2015巴厘岛的雕塑——数位DP
题目:https://www.luogu.org/problemnew/show/P3646 对于A>1,将答案各位全置1,然后从高位到低位改成0判断是否可行: 用f[i][j]数组代表前i个数 ...
- bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】
居然要对不同的数据写不同的dp= = 首先记得开long long,<<的时候要写成1ll<<bt 根据or的性质,总体思路是从大到小枚举答案的每一位,看是否能为0. 首先对于 ...
- 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
- bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
随机推荐
- Python基础1 Hello World!
从今天开始和大家分享一下python最基础的知识,以便帮助初学者快速入门. 最最基础的当然是hello world 了,无论哪门语言都会从它开始... 简单的‘Hello World!’ 1. 直接运 ...
- iOS- 多线程技术的概述及优点
1.概述 在iOS开发中: •耗时操作,例如网络图片.视频.歌曲.书籍等资源下载 •游戏中的声音播放 我们可以利用多线程: •充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更 ...
- python获取指定长度的字符串
from random import Random def random_str(randomlength=31): str = '' chars = 'abcdefghijklmnopqrstuvw ...
- ZigBee设备入网流程之关联方式
ZigBee设备入网流程 ZigBee设备入网有关联方式和直接方式两种,我所熟悉的是关联方式,这也是最常用的方式. 关联方式 step1 设备发出Beacon Request 设备会在预先设置的几个信 ...
- 第三部分shell编程3(shell脚本编写1)
做监控和备份最多 1. shell脚本是什么它是一种脚本语言,并非编程语言可以使用一些逻辑判断.循环等语法可以自定义子函数是系统命令的集合shell脚本可以实现自动化运维,大大增加我们的工作效率 第一 ...
- return 返回字符串
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- timer实现
实现一个 timer 前段时间写过一篇 blog 谈到 用 timer 驱动游戏 的一个想法.当 timer 被大量使用之后,似乎自己实现一个 timer 比用系统提供的要放心一些.最近在重构以前的代 ...
- InnoDB高并发原理
一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...
- input 输入框不能点 readonly , disabled
只读 readonly="readonly" 不可用 disabled="disabled" 背景变 灰色
- bootstrap 有些控件需要调用锚点,会与angular 路由 冲突
最简单的方法 就是 在 #号前加/, 但有人说 在服务器上回失效,也不知道是什么原理.慎用 最靠谱的方法 就 是 使用bootstrap中的js控制控件, 比如轮播图的上一页 下一页,就可以在 ang ...