在 $ N $ 天内,第 $ i $ 天每陪妹子 $ 1 $ 小时就要付出 $ c_i $ 的代价
(陪了妹子就不能刷题了)每连续的 $ 7 $ 天里至少陪妹子 $ 7 $ 个小时
(不然妹子就跑了)求出至少需要付出多少代价,$ N \le 10000 $
这是一个线性规划问题
设第 $ i $ 天陪 $ x_i $ 小时
目标函数 $ min \sum_{i=1}^{N}c_i x_i $
约束条件 $ x_i \ge 0 , x_i + x_{i+1} + ...... x_{i+6} \ge 7 $
用矩阵形式表示
\[ X= \begin{bmatrix} x_1\\x_2\\ \vdots \\x_N\end{bmatrix} , C= \begin{bmatrix} c_1\\c_2\\ \vdots \\c_N\end{bmatrix} , B=\begin{bmatrix} 7\\7\\ \vdots \\7\end{bmatrix} ,A=\begin{bmatrix} 1&1&1&1&1&1&1&0&0& \cdots &0\\0&1&1&1&1&1&1&1&0& \cdots &0\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \ddots & \vdots \\0&0&0&0&0&0&0&0&0& \vdots &1\end{bmatrix} \]
线性规划标准型
目标函数 $ min C^T X$
约束条件 $ X \ge 0 , AX \ge B $
线性规划对偶型
目标函数 $ max Y^T B $ (根据对偶定理,与原目标函数最优解相等)
约束条件 $ Y \ge 0 , Y^T A \le C^T $
这是一个差分约束系统
设 $ s_i = \sum_{j=1}^{i} Y_i $ ,目标 $ max7s_N $
约束条件:
$ s_i - s_{i-1} \ge 0 $
$ s_i - s_0 \le c_i (i < 7) , s_i - s_{i-7} \le c_i (7 \le N-7) , s_N - s_{i-1} \le (i > N-7) $
然而我并没有写出来,之后再填坑吧
更快的方法是动态规划
结论:每天要么陪 $ 7 $ 小时,要么不陪
$ F[i] $ 表示前 $ i $ 天,其中第 $ i $ 天必须陪,满足题目要求的最小代价
$ F[0]=0 $
$ F[i]=min_{i-7 \le j < i} {F[j]} +7c_i $
目标: $ min_{N-6 \le i \le N} { F[i] } $
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,c,f[10005],ans;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(f,0x3f,sizeof(int)*(n+1));
f[0]=0; ans=1e9+7;
for(int i=1;i<=n;++i){
scanf("%d",&c);
for(int j=max(i-7,0);j<i;++j)
f[i]=min(f[i],f[j]+7*c);
}
for(int i=max(n-6,0);i<=n;++i) ans=min(ans,f[i]);
printf("%d\n",ans);
}
return 0;
}