首页 > 其他分享 >CF10E 题解

CF10E 题解

时间:2024-03-02 16:59:40浏览次数:24  
标签:le int 题解 CF10E 零位 最小 表示法 贪心

传送门

有 \(n\) 种货币。找一个最小的金额 \(x\),使得贪心法付款不是最优解;如果贪心法始终都是最优解,输出 \(-1\)。\((n\le 400)\)

将货币集合记作一个 \(n\) 维向量 \(C=(c_1,c_2,\dots,c_n)\)。对于金额 \(x\) 的一个表示法,也记作一个 \(n\) 维向量 \(V\)。即 \(C\times V=x\)。

记金额 \(x\) 的贪心表示法为 \(G(x)\),最小表示法为 \(M(x)\)。同时要求这两个表示法都是字典序最大的。

易证 \(G(x)\) 的子集也是贪心表示,\(M(x)\) 的子集也是最小表示。

设 \(w\) 是最小的使得 \(G(w)\neq M(w)\) 的金额。因为 \(w\) 最小,所以 \(G(w),M(w)\) 一定不存在一个维度上都是非零的,否则可以让 \(w\) 更小。

设 \(i,j\) 是 \(M(w)\) 的最小和最大的非零位。(比如 \(M(w)=(0,1,1,0,2,0)\) 中 \(i=2,j=5\))

结论:\(M(w)\) 和 \(G(c_{i-1}-1)\)的 \(1,\dots,j-1\)位相同,第 \(j\) 位大 \(1\)。

证明:

\(G(w)\) 在 \(1\sim i-1\) 维上一定有非零的,否则因为非零位无交,\(G(w)\) 的第 \(i\) 维一定是 \(0\),但是因为 \(M(w)\) 第 \(i\) 维非零,所以 \(w\ge c_{i-1}\),与贪心法矛盾。所以 \(w\ge c_{i-1}\)。(1)

因为 \(w\) 是最小的,所以 \(G(w-c_j)=M(w-c_j)\)。因为 \(i\) 是 \(M(w)\) 最小的非零位,且 \(M(w),M(w-c_j)\) 的区别只有第 \(j\) 维差一,所以 \(M(w-c_j)\) 的前 \(i-1\) 位都是 \(0\)。

\(G(w-c_j)=M(w-c_j)\) 得出 \(G(w-c_j)\) 的前 \(i-1\) 位都是 \(0\)。所以 \(w-c_j<c_{i-1}\)。(2)

由(1):\(c_{i-1}-1-c_i<w-c_i\)。所以 \(G(c_{i-1}-1-c_i)<G(w-c_i)=M(w-c_i)\),两边都给第 \(i\) 位加一,得到 \(G(c_{i-1}-1)<M(w)\)。(3)

由(2)有 \(w-c_j\le c_{i-1}-1\),则 \(G(w-c_j)\le G(c_{i-1}-1)\),所以 \(M(w-c_j)\le G(c_{i-1}-1)\)。(4)

结合(3)(4),发现 \(M(w-c_j)\le G(c_{i-1}-1)<M(w)\)。

这说明第 \(j\) 维的变动会导致它们大小关系变化,因此 \(M(w),G(w)\) 的前 \(j-1\) 维相等。而 \(M(w)\) 在第 \(j\) 维之后都是 \(0\)(因为 \(j\) 是最大的非零位),因此 \(M(w)\) 的第 \(j\) 维大于 \(G(w)\) 的第 \(j\) 维。

那有没有可能 \(M(w).j-G(w).j\ge 2\) 呢?不可能,因为 \(w-c_j<c_{i-1}\le w\)。

于是我们证明了这个结论。(是不是都忘记我们要证明什么了?)

但是怎么转换到代码上?

int G(int x) { //x用贪心法的答案 
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		int d = x / c[i];
		ans += d;
		x -= c[i] * d;
	}
	return ans;
}
//...
int ans = 0x3f3f3f3f;
	for (int i = 2; i <= n; i++) {
		int x = c[i - 1] - 1;
		int cnt = 0; //把j理解成可以用到哪一位,cnt会维护贪心法的答案
		for (int j = i; j <= n; j++) {
			int d = x / c[j];
			cnt += d;
			x -= c[j] * d; //维护i~j贪心法答案
			if (cnt + 1 < G(c[i - 1] - 1 - x + c[j]))
				ans = min(ans, c[i - 1] - 1 - x + c[j]); 
        //因为M(w)和G(c[i-1]-1)只有第j维相差1,所以M(w)的数量就是cnt+1
        //此时cnt对应的w=c[i-1]-1-x+c[j],因为cnt维护的是i~j维的贪心法,所以要减去x;但是因为M(w)比G(c[i-1]-1)的第j维大1,所以要+c[j]
		}
	}

标签:le,int,题解,CF10E,零位,最小,表示法,贪心
From: https://www.cnblogs.com/FLY-lai/p/18048818

相关文章

  • NOIP2023 T4 题解
    T4写出转移方程:\(f_i\)表示前\(i\)天且第\(i\)天必须跑的最大能量值。\(g_i=\max\limits_{j=1}^i\{f_j\}\)。初值\(f_0=g_0=0\)。对于转移方程,考虑枚举最后一段跑的段是从哪里开始的:\(f_i=\displaystyle\max_{j=i-k+1}^i(g_{j-2}+prize(j,i)-(j-i+1)\timesd)\)。其中\(p......
  • SP14846 GCJ1C09C - Bribe the Prisoners 题解
    非常好区间dp。我们发现直接依题做是困难的,因此考虑反着做。也即,假定起初那\(Q\)个牢房均为空,现在要将给定的\(Q\)的犯人插入其中,求最小代价。然后我们发现这题和P1775很像,相当于每插入一个人,两段不相邻的牢房就被合并到了一起。接着我们就考虑这玩意怎么做区间dp。......
  • 【题解】「HDU 7084」Pty loves string
    CQBZOJHDU7084不难想到把最终在\(S\)从中间分开,就变成了前后两个broder拼起来。考场重现:直接把所有的broder求出来,将相同长度的broder的下标存在一起,然后暴力匹配,最后还没来及优化。考场代码(除了fail树,其她其实都挺逼近正解正解是建出fail树(甚至搞忘还有这东......
  • 2023互联网笔试记录汇总(61道真题+题解)
    以下编程题均为博主在2023年投递实习和秋招过程中的笔试真题(共61道编程题),为避免不必要的麻烦,不对题目的来源进行说明。3.4第一题题意:给一个数组(n≤2e5),求数组内任意数对的最大差值。即对任意i<j,求最大的x[j]-x[i]。题解:处理一下前缀最小值。第二题题意:给一个数组(n≤2e5......
  • 信息传递(题解)[并查集]
    题目题目描述有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有......
  • P10187 [USACO24FEB] Palindrome Game B 题解
    挑战题解区最短代码回文数?数学题!打表找规律吧……显然,\(1\sim9\)都是回文数,先手赢(就一位你还想咋地啊)。然后是\(10\)。样例告诉我们,这个不行。接着是\(11\sim19\),发现随便减个\(1\sim9\)就可以变成\(10\),而\(10\)是后手赢。赢得就是后手的后手,那就是先手,可以。......
  • P10189 [USACO24FEB] Maximizing Productivity B 题解
    先说说暴力做法:每次遍历一遍,看看是否满足\(t_i+s\lec_i\),满足就计数,不满足就挂。单次时间复杂度显然为\(O(N)\),总得时间复杂度约为\(O(NQ)\),TLE是肯定的~暴力代码//Problem:Problem3.MaximizingProductivity//Contest:USACO-USACO2024FebruaryContest,......
  • ABC295D 题解
    萌萌思维题,但是考场差一点AC。题目等价于寻找区间\([l,r]\)满足数字\(0\)~\(9\)各出现偶数次。根据找筷子这道题的经验,出现偶数次=异或和为\(0\)。但是发现如果和找筷子一样直接异或到一起会出现冲突(例子:$3\oplus5\oplus6=0$)。所以变成二进制数就可以了。......
  • ABC321F 题解
    可撤销背包的模板题。如果没有减操作就是\(01\)背包,众所周知转移方程是\(f[i]=f[i]+f[i-v]\)。考虑减操作,对于一个重量\(i\),不选物品\(v\)的方案数是什么呢?发现我们只需要把选\(v\)的方案去掉就好,那么转移方程就是\(f[i]=f[i]-f[i-v]\)。于是就做完了。注意取模变正......
  • ABC323D 题解
    这个题笔者场上Wa了六次……首先发现一个性质:考虑单个的\(s\),它自己所能合并成的块就是\(c\)的二进制表示。例如当\(s=3,c=7\)时,显然我们可以先两两合并,得到\(3\)个\(s=6\)的,再把其中的两个合并得到一个\(s=12\)的。发现\(7=(111)_2\),正好最终只有三个块:\(s=3,......