CodeChef 2017 March Challenge SCHEDULE - 烹饪计划

题目

大厨为接下来的 N 天定制了一个计划。在第 i 天,如果 Ai = 1,那么大厨会在那天工作;如果 Ai = 0,那么大厨就会休息。
大厨决定对这份计划做一些修改,最多修改 K 天的安排。大厨会选出最多 K 天,对于选出的每一天 i,如果 Ai = 1,则将其改成 0;否则将其改成 1。
修改之后应当保证,具有相同安排(即 Ai相等)的连续一段的日子天数最少。

题解
  1. 预处理出a[i]表示第i段连续相同的长度是多少。
  2. 二分答案lim,然后判断是否合法。
  3. 对于连续一段相同的,考虑不改变最左边和最右边的数,使当前段不会影响到相邻的段。那么我们每隔lim个数就改变一个数字,假如要改变最后一个数字,就变成改变倒数第二个数字以保证不改变最右边的数,这样一段需要改变的数字就是a[i]/(lim+1)判断一个总共改变数字的个数与k的关系即可。
  4. 但是当lim=1时不能保证不改变最左和最右的数,那么特判一下即可。
#include<bits/stdc++.h>
using namespace std;
char a[1000010];
int b[1000010],cnt,k,n;
bool check(int x)
{
	int s=0,i;
	for(i=1; i<=cnt; i++)
		s+=b[i]/(x+1);
	return s<=k;
}
int main()
{
	int t,i,l,r,ans,mid,x;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%s",&n,&k,a+1);
		cnt=1;
		b[1]=1;
		for(i=1; i<=n; i++)
		{
			if(a[i]==a[i-1]) b[cnt]++;
			else
			{
				cnt++;
				b[cnt]=1;
			}
		}
		x=0;
		for(i=1; i<=n; i++)
			if(a[i]-'0'==(i&1)) x++;
		if(x<=k||(n-x)<=k)
		{
			printf("1\n");
			continue;
		}
		l=2;
		r=n;
		ans=0;
		while(l<=r)
		{
			mid=(l+r)/2;
			if(check(mid)) r=mid-1,ans=mid;
			else l=mid+1;
		}
		printf("%d\n", ans);
	}
	return 0;
}
March-Copula-CoVaR 模型是一个基于 Copula 函数的风险测度模型,适用于金融领域的风险分析和预测。以下是 Python 实现的代码示例: 首先需要安装相关依赖: ```python !pip install numpy !pip install scipy !pip install pandas !pip install matplotlib !pip install seaborn !pip install statsmodels ``` 接下来是代码实现: ```python import numpy as np import pandas as pd from scipy.stats import norm from scipy.optimize import minimize import statsmodels.api as sm def march_copula_covar(data, alpha=0.05, window=250, method='MLE'): """ 计算 March-Copula-CoVaR :param data: pd.DataFrame, 包含各资产收益率的数据 :param alpha: float, 置信水平 :param window: int, 窗口长度 :param method: str, 优化方法,可选 'MLE' 或 'CML' :return: pd.Series,各资产的 CoVaR 值 """ # 计算对数收益率 log_returns = np.log(data / data.shift(1)).dropna() # 计算协方差矩阵和相关系数矩阵 cov_matrix = log_returns.rolling(window=window).cov().dropna() corr_matrix = log_returns.rolling(window=window).corr().dropna() # 计算 VaR variances = [] for i in range(len(log_returns.columns)): log_returns_ = log_returns.iloc[:, i] variances.append(np.var(log_returns_)) variances = np.array(variances) variances /= np.sum(variances) variances = pd.Series(variances, index=log_returns.columns) var = norm.ppf(alpha) * np.sqrt(np.dot(variances, np.dot(cov_matrix, variances))) # 计算 CoVaR def obj_fun(weights): return -1 * np.dot(weights, log_returns.tail(1)) if method == 'MLE': # 极大似然估计 def log_likelihood(theta): u = norm.cdf(np.dot(log_returns.tail(1), theta)) copula_density = np.prod(np.power(u, theta) / np.power(u, theta - 1)) return np.log(copula_density) def obj_fun(weights): return -1 * log_likelihood(weights) res = minimize(obj_fun, [1.0] * len(log_returns.columns), method='Nelder-Mead') theta = res.x else: # 伪最小二乘估计 model = sm.OLS(log_returns.tail(1), sm.add_constant(log_returns[:-1])) res = model.fit() theta = res.params[1:] u = norm.cdf(np.dot(log_returns.tail(1), theta)) d_u = norm.pdf(norm.ppf(alpha)) / alpha covar = [] for i in range(len(log_returns.columns)): log_returns_ = log_returns.iloc[:, i] rho = corr_matrix.iloc[i].loc[log_returns.columns != log_returns.columns[i]].values w = np.dot(np.linalg.inv(cov_matrix.iloc[i].values[np.newaxis]), rho) w /= np.sum(w) covar_i = np.dot(w, log_returns.tail(1).iloc[0, log_returns.columns != log_returns.columns[i]]) covar.append(covar_i) covar = np.array(covar) covar /= np.sum(covar) covar = pd.Series(covar, index=log_returns.columns) covar *= d_u * var / np.sqrt(np.dot(covar, np.dot(cov_matrix, covar))) return covar ``` 该函数输入一个包含各资产收益率的数据框 `data`,并返回一个 `pd.Series` 类型的结果,包含各资产的 CoVaR 值。其中,`alpha` 参数表示置信水平,默认为 0.05;`window` 参数表示窗口长度,默认为 250;`method` 参数表示优化方法,可选 'MLE' 或 'CML',默认为 'MLE'。 使用示例: ```python # 读取数据 data = pd.read_csv('data.csv', index_col=0) data.index = pd.to_datetime(data.index) # 计算 CoVaR covar = march_copula_covar(data) print(covar) ``` 以上代码仅作为示例供参考,实际应用中需要根据数据情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值