CF 1106 E. Lunar New Year and Red Envelopes

本文探讨了一种基于贪心策略的动态规划解决方案,通过O(nlogn+nm)的总转移复杂度来求解最小收入问题。文章详细介绍了如何使用set和multiset进行键值判重,以及如何在特定条件下实现高效的贪心策略。

一个人有一种贪心策略,我们有m次机会让他在一个时刻不能操作,求那个人的最小收入。。。。。。
明显O(nm)O(nm)O(nm)状态,set维护一下可以O(log⁡n)O(\log n)O(logn)得出贪心策略,可以做到O(nlog⁡n+nm)O(n \log n+nm)O(nlogn+nm)的总转移复杂度。
set判重是看(!a<b) && (!b<a) , 就算键值不同也可能被判相同(WA了两发),以后还是用multiset吧。

AC Code:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<set>
#define LL long long
#define maxn 100005
using namespace std;

int n,m,k;
LL dp[maxn][205];
int s[maxn],t[maxn],w[maxn],d[maxn];
vector<int>G[maxn],D[maxn];

struct node
{
	int id;
	node(int id=0):id(id){}
	bool operator <(const node &B)const
	{
		return w[id] == w[B.id] ? d[id] == d[B.id] ? id < B.id : d[id] > d[B.id] : w[id] > w[B.id];
	}
};

set<node>st;
	
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=k;i++)
	{
		scanf("%d%d%d%d",&s[i],&t[i],&d[i],&w[i]);
		G[s[i]-1].push_back(i) , D[t[i]].push_back(i);
	}
	
	memset(dp,0x3f,sizeof dp);
	dp[n+1][0] = 0;
	for(int i=n;i>=1;i--)
	{
		for(int j=0,siz=D[i].size();j<siz;j++)
			st.insert(node(D[i][j]));
		for(int j=0,siz=G[i].size();j<siz;j++)
			st.erase(node(G[i][j]));
		if(st.empty())
		{
			for(int j=0;j<=m;j++)
				dp[i][j] = dp[i+1][j];
		}
		else
		{
			int id = (*st.begin()).id;
			for(int j=0;j<=m;j++)
				dp[i][j] = dp[d[id]+1][j] + w[id];
			for(int j=1;j<=m;j++)
				dp[i][j] = min(dp[i][j] , dp[i+1][j-1]);
		}
	}
	LL ans = 1e18;
	for(int i=0;i<=m;i++)
		ans = min(ans,dp[1][i]);
	printf("%I64d\n",ans);
}
### 四柱八字计算原理 四柱八字是一种古老的中国命理学方法,用于分析一个人的命运。它基于公历日期转换为农历日期,并提取对应的天干地支来构建四个“柱子”,即年柱、月柱、日柱和时柱[^1]。 以下是实现四柱八字计算的核心逻辑: 1. **公历转农历**:将输入的公历年份、月份和日期转化为农历日期。 2. **天干地支匹配**:根据农历日期找到对应的天干地支组合。 3. **验证合法性**:确保天干地支之间的阴阳属性一致(阳天干配阳地支,阴天干配阴地支)。 4. **时间处理**:对于小时部分,需依据传统时辰划分表进行映射。 下面是一个完整的 Python 实现示例: ```python from datetime import datetime, timedelta import calendar def gregorian_to_lunar(year, month, day): """ 将公历日期转换为农历日期。 返回 (lunar_year, lunar_month, lunar_day) """ # 假设有一个函数可以完成这个功能,这里简化处理 # 可以使用第三方库如 `zhdate` 或其他工具替代 lunar_date = convert_gregorian_to_lunar(year, month, day) # 需要具体实现或调用外部库 return lunar_date.year, lunar_date.month, lunar_date.day def get_stem_branch(date_type, value): """ 获取指定类型的天干地支。 date_type: 'year', 'month', 'day' or 'hour' value: 对应的日历数值 """ stems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'] branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'] stem_index = { 'year': lambda y: (y - 1984) % 10, 'month': lambda m: ((m - 1) * 2 + 1) % 10, 'day': lambda d: (d - 37) % 10, 'hour': lambda h: (h // 2) % 10 }[date_type](value) branch_index = { 'year': lambda y: (y - 1984) % 12, 'month': lambda m: (m - 1) % 12, 'day': lambda d: (d - 6) % 12, 'hour': lambda h: h % 12 }[date_type](value) return stems[stem_index], branches[branch_index] def validate_pillar(stem, branch): """ 验证天干地支是否合法。 """ yang_stems = {'甲', '丙', '戊', '庚', '壬'} yin_stems = {'乙', '丁', '己', '辛', '癸'} yang_branches = {'子', '寅', '辰', '午', '申', '戌'} yin_branches = {'丑', '卯', '巳', '未', '酉', '亥'} if stem in yang_stems and branch not in yang_branches: return False elif stem in yin_stems and branch not in yin_branches: return False return True def calculate_bazi(gregorian_date, hour): """ 计算四柱八字。 输入参数: gregorian_date: 公历日期对象 (datetime.date) hour: 当前时刻的小时数 (int),范围 [0, 23] 输出结果: bazi: 字典形式表示的四柱八字 {column_name: (stem, branch)} """ year, month, day = gregorian_date.year, gregorian_date.month, gregorian_date.day lunar_year, lunar_month, lunar_day = gregorian_to_lunar(year, month, day) pillars = {} pillars['年柱'] = get_stem_branch('year', lunar_year) pillars['月柱'] = get_stem_branch('month', lunar_month) pillars['日柱'] = get_stem_branch('day', lunar_day) pillars['时柱'] = get_stem_branch('hour', hour) for name, (stem, branch) in pillars.items(): if not validate_pillar(stem, branch): raise ValueError(f"{name} 的天干地支不合法") return pillars if __name__ == "__main__": input_date = datetime(1990, 5, 27).date() # 示例输入 input_hour = 15 # 下午三点 try: result = calculate_bazi(input_date, input_hour) print(result) except Exception as e: print(e) ``` 上述代码实现了从公历日期到四柱八字的完整转化过程,并包含了基本的合法性校验机制。 ### 注意事项 - 上述代码中的 `gregorian_to_lunar` 函数需要替换为实际可用的农历转换逻辑,推荐使用成熟的第三方库(如 `zhdate`)。 - 时间戳与时区可能会影响最终结果,请确保输入的时间数据已标准化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值