C - Pen Counts

本文介绍了一种通过枚举最短边并利用数学关系计算特定条件下不同三角形数量的算法。该算法适用于求解边长总和固定的整数边长三角形的数量问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
发现比赛的时候很多人水过= =
各种打表 。。。
我的解法:
	枚举最短的边
	假设三角形的边长为x<=y<=z
	则有如下关系:
		x+y+z=n
		x+y>z>=max(x,y)
	将z用n-x-y替换,就可以得出对于每个确定x,的y的范围;
	max(x-1,n/2-x)<=y<(n-x)/2
	剩下就仅需要判断一下特殊情况
*/
//#pragma comment(linker, "/STACK:167772160")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <ctime>
#include <cmath>
#include <cassert>
//#include <fstream>
#include <stack>
#include <cctype>
#define MP make_pair
#define PB push_back
#define SZ(x) (int)x.size()
#define INF 1<<29
#define pii pair<int,int>
#define pll pair<LL,LL>
#define vi vector<int>
#define L(x) x<<1
#define R(x) x<<1|1
#if(_WIN32||__WIN32__)
    #define LL __int64
    #define ll I64
#else
    #define LL long long
#endif
//#define Local

using namespace std;

int calc(int n)
{
	int sum=0;
	for(int i=1;i<=(n)/3;i++)
	{
		sum+=((n-i)/2-max((n)/2-i,i-1))*2;
		if(n-i*2<i+i)
			sum--;
		if((n-i)/2*2==n-i)
			sum--;
		if(n-i*2==i)
			sum++;
	}
	return sum;
}

int main()
{
	int n,Case,T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d %d",&Case,&n);
		printf("%d %d\n",Case,calc(n));
	}
    return 0;
}

根据你的介绍的方法,融合进我的r# 加载所需库 library(glmnet) library(quantreg) library(ggplot2) library(dplyr) library(KernSmooth) library(reshape2) library(ggpubr) # 跨平台字体设置 if (.Platform$OS.type == "windows") { # Windows系统使用SimHei windowsFonts(SimHei = windowsFont("SimHei")) default_font <- "SimHei" } else { # macOS系统使用Heiti TC default_font <- "Heiti TC" } # 应用字体设置 theme_update(text = element_text(family = default_font)) # 数据准备 --------------------------------------------------------------- data <- read.csv("/Users/lijiawei/Desktop/变量选择.csv", fileEncoding = "UTF-8") colnames(data)[1] <- "index_return" component_cols <- colnames(data)[-1] # 划分训练集和测试集 set.seed(123) n <- nrow(data) train_idx <- sample(1:n, floor(0.7 * n)) test_idx <- setdiff(1:n, train_idx) train_data <- data[train_idx, ] test_data <- data[test_idx, ] # 数据标准化处理 (保持数据框结构) train_data_std <- train_data %>% mutate(across(all_of(component_cols), ~ .x - mean(.x, na.rm = TRUE))) test_data_std <- test_data %>% mutate(across(all_of(component_cols), ~ .x - mean(.x, na.rm = TRUE))) # 准备数据框格式 (保留列名) X_train_df <- train_data_std[, component_cols, drop = FALSE] X_test_df <- test_data_std[, component_cols, drop = FALSE] y_train <- train_data$index_return y_test <- test_data$index_return # 1. 自适应LASSO模型 ----------------------------------------------------- # 转换为矩阵格式 X_train_mat <- as.matrix(X_train_df) X_test_mat <- as.matrix(X_test_df) # 训练模型 lasso_cv <- cv.glmnet(X_train_mat, y_train, alpha = 1) lambda_opt <- lasso_cv$lambda.min # 变量选择 lasso_coef <- as.vector(coef(lasso_cv, s = "lambda.min"))[-1] selected_idx_lasso <- which(lasso_coef != 0) selected_vars_lasso <- component_cols[selected_idx_lasso] num_selected_lasso <- length(selected_vars_lasso) # 预测计算 train_pred_lasso <- predict(lasso_cv, X_train_mat, s = "lambda.min") %>% as.numeric() test_pred_lasso <- predict(lasso_cv, X_test_mat, s = "lambda.min") %>% as.numeric() # 2. 改进的核密度加权分位数回归及变量选择 ------------------------------ # 定义函数:使用稳定性选择进行变量筛选(修复版) select_variables_stability <- function(X, y, n_boot = 50, prob = 0.7, tau = 0.5) { n_vars <- ncol(X) selection_freq <- rep(0, n_vars) col_names <- colnames(X) # 保存变量名 # 多次抽样训练分位数回归模型 for(i in 1:n_boot) { # 有放回抽样(同时抽样X和y,保持索引一致) boot_idx <- sample(1:nrow(X), replace = TRUE) X_boot <- X[boot_idx, , drop = FALSE] # 保持数据框结构 y_boot <- y[boot_idx] # 合并成完整数据集 df_boot <- data.frame(y_boot, X_boot) colnames(df_boot)[1] <- "y" # 重命名因变量列 # 构建动态公式(使用所有自变量列) formula <- as.formula(paste("y ~", paste(col_names, collapse = "+"))) # 训练分位数回归模型(通过data参数传递数据框) model <- rq(formula, data = df_boot, tau = tau) coefs <- coef(model)[-1] # 排除截距项,获取自变量系数 # 记录变量是否被选中(系数绝对值大于阈值) selection_freq <- selection_freq + (abs(coefs) > 1e-6) } # 计算选择频率 selection_prob <- selection_freq / n_boot # 选择频率超过阈值的变量 selected_idx <- which(selection_prob >= prob) return(list(selected_idx = selected_idx, selection_prob = selection_prob)) } # 使用稳定性选择进行变量筛选 set.seed(456) stability_result <- select_variables_stability( X = X_train_df, y = y_train, n_boot = 100, prob = 0.6, tau = 0.5 ) selected_idx_cqr <- stability_result$selected_idx selection_prob <- stability_result$selection_prob # 计算每个变量在不同分位数下的平均系数绝对值作为重要性度量 calc_var_importance <- function(X, y, taus = c(0.25, 0.5, 0.75)) { var_importance <- matrix(0, nrow = ncol(X), ncol = length(taus)) for(i in seq_along(taus)) { model <- rq(y ~ X, tau = taus[i]) var_importance[, i] <- abs(coef(model)[-1]) # 排除截距项 } # 计算平均重要性 mean_importance <- rowMeans(var_importance) return(mean_importance) } # 计算变量重要性 var_importance <- calc_var_importance(X_train_df, y_train) # 结合稳定性选择和变量重要性进行最终变量选择 final_selected_idx <- intersect( selected_idx_cqr, which(var_importance > quantile(var_importance, 0.75)) # 选择重要性前25%的变量 ) selected_vars_cqr <- component_cols[final_selected_idx] num_selected_cqr <- length(selected_vars_cqr) # 构建只包含选择变量的模型公式 if(num_selected_cqr > 0) { formula_str_cqr <- paste("y_train ~", paste(selected_vars_cqr, collapse = "+")) model_formula_cqr <- as.formula(formula_str_cqr) } else { # 如果没有选择任何变量,使用所有变量 formula_str_cqr <- paste("y_train ~", paste(component_cols, collapse = "+")) model_formula_cqr <- as.formula(formula_str_cqr) final_selected_idx <- 1:length(component_cols) selected_vars_cqr <- component_cols num_selected_cqr <- length(selected_vars_cqr) } # 训练基础分位数回归 (仅使用选择的变量) base_models <- lapply(tau_seq, function(tau) { rq(model_formula_cqr, data = cbind(y_train, X_train_df[, final_selected_idx, drop = FALSE]), tau = tau) }) # 计算核密度权重 residuals <- sapply(base_models, residuals) avg_resid <- rowMeans(residuals) if(length(unique(avg_resid)) == 1) { weights <- rep(1/length(avg_resid), length(avg_resid)) } else { kde <- bkde(avg_resid) dens_fun <- approxfun(kde$x, kde$y, rule = 2) weights <- dens_fun(avg_resid) weights <- weights / sum(weights) } # 训练加权模型 weighted_models <- lapply(tau_seq, function(tau) { rq(model_formula_cqr, data = cbind(y_train, X_train_df[, final_selected_idx, drop = FALSE]), tau = tau, weights = weights) }) # 确保测试数据格式正确 test_data_df_cqr <- data.frame(X_test_df[, final_selected_idx, drop = FALSE]) colnames(test_data_df_cqr) <- selected_vars_cqr # 生成预测 test_pred_cqr <- rowMeans(sapply(weighted_models, function(m) { predict(m, newdata = test_data_df_cqr) })) # 3. 结果计算 ----------------------------------------------------------- # 维度校验 stopifnot(length(y_test) == length(test_pred_lasso)) stopifnot(length(y_test) == length(test_pred_cqr)) # 计算误差指标 metrics <- data.frame( 方法 = c("自适应LASSO", "改进核密度CQR"), 内预测误差 = c( mean((y_train - train_pred_lasso)^2), mean((y_train - predict(weighted_models[[2]]))^2) # 使用中位数模型代表 ), 外预测误差 = c( mean((y_test - test_pred_lasso)^2), mean((y_test - test_pred_cqr)^2) ) ) # 变量选择结果 - 包含所有方法 selection_counts <- data.frame( 方法 = c("自适应LASSO", "改进核密度CQR"), 筛选数量 = c(num_selected_lasso, num_selected_cqr) ) # 入选成分股结果 - 包含所有方法 selected_stocks <- data.frame( 方法 = c("自适应LASSO", "改进核密度CQR"), 入选成分股 = c( paste(selected_vars_lasso, collapse = ", "), if(num_selected_cqr > 0) paste(selected_vars_cqr, collapse = ", ") else "无显著变量" ) ) # 4. 结果输出 ----------------------------------------------------------- cat("=== 表格1: 预测误差比较 ===\n") print(metrics) cat("\n=== 表格2: 变量选择数量 ===\n") print(selection_counts) cat("\n=== 表格3: 入选成分股 ===\n") print(selected_stocks) # 5. 可视化输出 --------------------------------------------------------- # 预测结果对比图 plot_df <- data.frame( Date = seq_along(y_test), Actual = y_test, LASSO = test_pred_lasso, CQR = test_pred_cqr ) p1 <- ggplot(plot_df, aes(x = Date)) + geom_line(aes(y = Actual, color = "实际值"), linewidth = 1) + geom_line(aes(y = LASSO, color = "LASSO预测"), linetype = "dashed") + geom_line(aes(y = CQR, color = "CQR预测"), linetype = "dotted") + scale_color_manual( name = "图例", values = c("实际值" = "black", "LASSO预测" = "blue", "CQR预测" = "red") ) + labs(title = "指数追踪效果对比", x = "样本序号", y = "收益率") + theme_bw() + theme( legend.position = "bottom", text = element_text(family = default_font), plot.title = element_text(hjust = 0.5) ) # 变量重要性图 (仅显示CQR选择的变量) importance_df <- data.frame( 变量 = selected_vars_cqr, 重要性 = var_importance[final_selected_idx] ) # 按重要性排序 importance_df <- importance_df[order(-importance_df$重要性), ] p2 <- ggplot(importance_df, aes(x = reorder(变量, -重要性), y = 重要性)) + geom_bar(stat = "identity", fill = "skyblue") + coord_flip() + labs(title = "改进核密度CQR变量重要性", x = "变量", y = "重要性") + theme_bw() + theme( text = element_text(family = default_font), plot.title = element_text(hjust = 0.5) ) # 稳定性选择结果可视化 stability_df <- data.frame( 变量 = component_cols, 选择概率 = selection_prob ) # 只显示选择概率大于0的变量 stability_df <- stability_df[stability_df$选择概率 > 0, ] stability_df <- stability_df[order(-stability_df$选择概率), ] p3 <- ggplot(stability_df, aes(x = reorder(变量, -选择概率), y = 选择概率)) + geom_bar(stat = "identity", fill = "lightgreen") + coord_flip() + labs(title = "变量稳定性选择概率", x = "变量", y = "选择概率") + theme_bw() + theme( text = element_text(family = default_font), plot.title = element_text(hjust = 0.5) ) # 显示所有图表 gridExtra::grid.arrange(p1, p2, p3, ncol = 1, heights = c(2, 1.5, 1.5))
05-12
一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值