首页 > 其他分享 >关于一类最优解存在长度为 $k$ 的循环节的问题

关于一类最优解存在长度为 $k$ 的循环节的问题

时间:2023-11-21 21:44:59浏览次数:45  
标签:bmod 循环 forall 长度 最优 sum

灵感来源

问题形式:给定长度为 \(n\) 的序列,要求选出一些位置,使这些位置满足限制条件 \(T\),其中 \(T\) 可以表述为一个长度为 \(k\) 的环满足条件 \(T'\),选出第 \(i\) 个位置的收益是 \(f(i\bmod k)\),求最大收益。

关键在于证明一个引理:最优解一定存在长度为 \(k\) 的循环节。证明如下:

假设 \(n \bmod (x+y) \neq 0\), 等于 0 是 trivial 的。则把 \(1 \sim n\) 分为若干个段, 从左往右, 第奇数个段 (下标从 1 开始) 的长度是余数 \(r\), 偶数段的长度是 \(x+y-r\), 共有奇数个段。

设 \(d l t_i\) 表示把所有与第 \(i\) 个段的下标奇保性相同的段全部改为 \(i\), 序列总权值的变化量 (不考虑合不合法)。显然 \(\sum_k d l t_{2 k+1}=\) \(\sum_k d l t_{2 k}=\sum_k d l t_k=0\) 。我们想证明的, 其实是 \(\exists x, d l t_x+d l t_{x+1} \geq 0\) ,反证, 假设不存在, 即 \(\forall x, d l t_x+d l t_{x+1}<0\), 则

  • \(d l t_2+d l t_3<0, d l t_4+d l t_5<0, \ldots\), 可以得到 \(\sum_{i \neq 1} d l t_i<0\) 。但 \(\sum d l t_i=0\), 因此 \(d l t_1>0\) 。

  • \(d l t_1+d l t_2<0, d l t_4+d l t_5<0, \ldots\), 可以得到 \(\sum_{i \neq 3} d l t_i<0\) 。 但 \(\sum d l t_i=0\), 因此 \(d l t_3>0\) 。

  • 以此类推得到 \(\forall k, d l t_{2 k+1}>0\) 。

与 \(\sum_k d l t_{2 k+1}=0\) 矛盾。证毕。

有长度为 \(k\) 的循环节,一切就都好做了。

标签:bmod,循环,forall,长度,最优,sum
From: https://www.cnblogs.com/Charlie-Vinnie/p/17847680.html

相关文章

  • 如何在 PHP 中使用 while 循环按 ID 列出节中的数据?
    要在PHP中使用while循环按ID列出数据,您可以按照以下步骤进行操作:创建数据库连接:首先,您需要使用适当的凭据来连接到数据库。您可以使用mysqli或PDO等库来实现数据库连接。$servername="localhost";$username="your_username";$password="your_password";$dbname......
  • 无涯教程-Sed - 循环语句
    与其他编程语言一样,SED也提供了循环和分支函数来控制执行流程。在本章中,无涯教程将探索更多有关如何在SED中使用循环和分支的信息。SED中的循环的工作方式类似于goto语句。SED可以跳到标签所标签的行,然后继续执行其余命令。在SED中,可以如下定义label :label:start:end......
  • C语言:用for循环语句编写金字塔
       今天我将继续为大家分享C语言的知识,今天要分享的内容依旧是C语言中的for循环语句中的经典例题。好了,废话少说,让我们进入今天的学习内容吧!#include<stdio.h>intmain(){inti,j,c;for(i=1;i<=10;i++)//十行的金字塔{for(j=1;j<=15-i;j++)//*前面有15-i个......
  • 遍历循环,只要有其中一个符合就退出
    使用stream流的anyMatch判断的条件里,任意一个元素成功,返回true上代码List<SectorInfo>sectorsInfo=scanResultParser.apply(scanResult);returnsectorsInfo.stream().map(sectorInfo->badSectorCountParser.apply(sectorInfo.getValue()))......
  • cmm脚本之,循环、变量
    OPEN#1test.txt/CreateLOCAL&Emdc_Rx_Timestape&Emdc_Rx_Timestape=V.VALUE(Emdc_Rx_Timestape)PRINTV.VALUE(Emdc_Rx_Timestape)"&Emdc_Rx_Timestape"RePeaT100.(IFV.VALUE(Emdc_Rx_Timestape)!=V.VALUE(Emdc_Rx_Timestape)......
  • 如何在 PHP 中使用 while 循环按 ID 列出节中的数据?
    要在PHP中使用while循环按ID列出数据库中的数据,您需要遵循以下步骤:创建数据库连接:首先,您需要使用适当的凭据来连接到数据库。您可以使用mysqli或PDO等库来实现数据库连接。$dbHost='localhost';$dbUsername='your_username';$dbPassword='your_password';$dbNam......
  • 项目循环依赖解决
    问题:项目启动时报出错误信息,Thedependenciesofsomeofthebeansintheapplicationcontextformacycle:┌─────┐````|intermediateServicedefinedinfile[E:\projects\business-server\target\classes\com\hyit\business\server\Intermediate\IntermediateSe......
  • for循环
    ......
  • c语言学习-while 循环
    intmain(){ inta=0; printf("joinus"); printf("codenow"); while(a<20000){ printf("写了%d\n",a); a++; } printf("已经写好了%d\n",a); printf("有好offer了"); return0;}......
  • shell 循环控制shift、continue、break、exit
    shift命令#位置参数可以用shift命令左移。比如shift3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift1。#测试shift命令(x_shift3.sh)[root@linux-serverscript]#catx_shift3.sh #!/bin/bashshiftecho"......