CF10E Greedy Change

  • 题意:
    CF10E
    有一些大到小排列货币 a1...n,每个可以选无限个,最小化凑出 S 的货币个数。

找到一个最小的hack贪心大到小选的 S

  • 结论:

G(S)(v1,v2,...vn), 为贪心下每个货币选了的个数,实际上求的是满足和为 S最大字典序

M(S) 为最优解每个货币选了的个数,实际上求的是个数最少的前提下的最大字典序

如果存在反例 w, 那么 M(w)<G(w)

  1. M(w)G(w) 每位互不相同,可以理解为用零散的小的货币拼出一个完整的大货币,恰好不相交。

  2. M(w) 的最小和最大非零位为 i,j, M(w)G(ci11)1...j1 为相同,第 j 位大 1。

所以可以枚举最高位的 j, 这里 w 就是前 1...j位 的 ci11 加上一个 aj。 利用 G(ci11)+1 算出 M(w),再算出 G(w) 比较。

int n;
cin >> n; 
vector<ll> a(n); 
for (ll &i : a) cin >> i; 
ll ans = INF;
for (int i = 1; i < n; i ++) {
        auto G = [=] (int x) {
		int cnt = 0;
	        for (ll i : a) 
		    cnt += x / i, x %= i; 
		return cnt;  
	}; 
	int c = a[i - 1] - 1, now = c; 
	int M = 0;
	for (int j = i; j < n; j ++) {
		M += now / a[j]; 
		now %= a[j];
		ll w = c - now + a[j];  
		if (M + 1 < G(w)) 
		    ans = min(ans, w) ; 
	}
}
if (ans == INF) cout << -1;
else cout << ans;

posted @   qjbqjb  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示