巴厘岛的雕塑(sculptures)
巴厘岛的雕塑(sculptures)
印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道。
在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 1 到 N 连续地进行标号,其中第 i 座雕塑的年龄是 Yi 年。为了使这条路的环境更加优美,政府想把这些雕塑分成若干组,并通过在组与组之间种上一些树,来吸引更多的游客来巴厘岛。
下面是将雕塑分组的规则:
(1) 这些雕塑必须被分为恰好 X 组,其中 A≤X≤B,每组必须含有至少一个雕塑,每个雕塑也必须属于且只属于一个组。同一组中的所有雕塑必须位于这条路的连续一段上。
(2)当雕塑被分好组后,对于每个组,我们首先计算出该组所有雕塑的年龄和。
(3)计算所有年龄和按位取或的结果。我们这个值把称为这一分组的最终优美度。
请问政府能得到的最小的最终优美度是多少?
备注:将两个非负数 P 和 Q 按位取或是这样进行计算的:
(1) 首先把 P 和 Q 转换成二进制:设 nP是P的二进制位数,nQ是Q的二进制位数,M为 nP和nQ中的最大值。P的二进制表示为 pM-1 p M-2 ... p1 p0,Q 的二进制表示为 qM-1 qM-2 ... q1 q0,其中 pi 和 qi分别是 P 和 Q 二进制表示下的第 i 位,第 M−1 位是数的最高位,第 0 位是数的最低位。
(2) P 与 Q 按位取或后的结果是:
(pM-1 OR qM-1 )( p M-2 OR qM-2)...(p1 OR q1)( p0 OR q0)。其中:
0 OR 0 = 0 0 OR 1 = 1
1 OR 0 = 1 1 OR 1 = 1
|Subtask #|分值||||
|-|-|-|-|-|
|1|9||||
|2|16||||
|3|21||||
|4|25||||
|5|29||||
Solution
这数据范围是2合1啊
考虑
设计dp f[i][j]表示前i个雕塑,分成j组的最大或。
然而这么dp会有后效性--前面最优不保证整体最优。
考虑在外面按位确定答案,转化为可行性问题,然后就可以dp了
效率O(n^3*60)
考虑
同样是按位确定答案,只是这时可简化状态为f[i]表示划分完前i个的最小段数。
效率O(n^2*60)
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; int n,f[102][102],A,B,g[2004]; ll a[2005],la; int main(){ cin>>n>>A>>B; for(int i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]+=a[i-1]; if(n<=100){ for(ll ws=40;ws>=0;ws--){ la=la+(1LL<<ws); memset(f,0,sizeof f); for(int i=0;i<=0;i++)f[0][i]=1; for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ for(int k=j-1;k<i;k++){ f[i][j]|=(f[k][j-1]&(((a[i]-a[k])&la)==0)); if(ws==3){ //printf("ws=%d k=%d f[%d] [%d] =%d\n",ws,k,i,j,f[i][j]); //printf("%d %d\n",(a[i]-a[k]),la,(a[i]-a[k])&la); } } } } int fl=0; for(int i=A;i<=B;i++)if(f[n][i]){fl=1;break;} if(!fl)la-=(1LL<<ws); } } else { for(ll ws=40;ws>=0;ws--){ la=la+(1LL<<ws); memset(f,0,sizeof f); for(int i=1;i<=n;i++)g[i]=1e9; for(int i=1;i<=n;i++){ for(int j=0;j<=i;j++){ if(((a[i]-a[j])&la)==0)g[i]=min(g[i],g[j]+1); } } if(g[n]>B)la-=(1LL<<ws); } } ll Max=(1LL<<41)-1; cout<<Max-la<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构