首页 > 其他分享 >CF10E Greedy Change 题解

CF10E Greedy Change 题解

时间:2023-02-24 13:44:07浏览次数:47  
标签:那么 int 题解 CF10E 选取 余数 我们 Change 贪心

一个非常离谱的题。

首先有结论,如果有 \(w\) 使贪心不为最优解,那么比 \(w\) 小的第一个 \(a_i\),用贪心法求面值为 \(a_i-1\),除了最后选的一个数 \(a_j\) 会比原方法多选一个,其余与用动态规划求 \(w\) 面值的选取方式一样。

理论求法过于多,这次我们选择一个通俗易懂的讲法。

如果我们用贪心,那么我们一定会取当前的最大值,那么如果贪心是错的那么我们就不会取当前最大值。

所以我们对于每一位 \(a_i\),我们要寻找不选它更优的方案,假设贪心中选取 \(a_i\) 后会选择 \(a_j\),那么动态规划一定会选取 \(a_{i+1}\) 到 \(a_{j-1}\) 的数,如果选取比 \(a_j\) 还小的数,那么一定不会是最优。

证明不会选比 \(a_j\) 小的数:假设我们把贪心中足够个 \(a_j\) 拆成数个 \(a_k(k<j)\),那么把 \(a_k\) 间互相抵消后,贪心中数只会增加不会减少,因为拆开一次 \(a_j\),至少会有两个数出现。

所以我们只需找到最小的数满足只取 \(a_{i+1}\) 到 \(a_{j-1}\) 的数且刚好大于 \(a_i\) 可以满足的最小的 \(w\)。

那么求这个就可以先枚举 \(i\),\(j\),然后贪心求解。

如何贪心求解呢,首先我们先用面值为 \(a_i-1\) 去拼凑,保证这些数最后凑出来不大于 \(a_i\),拼凑出来肯定会有余数,那么减去这个余数,加上 \(a_{j-1}\),由于最后余数肯定小于 \(a_{j-1}\),所以加上 \(a_{j-1}\) 后一定会大于等于 \(a_i\)。

证明上述贪心正确:因为求出来的余数 \(t\) 一定小于 \(a_{j-1}\),所以补上那个余数最小花费为 \(t-a_{j-1}\),不存在利用其他数相加得成。

而这下就会有人问,因为有可能加上一个 \(a_{j-1}\) 会补成之前的一个数 \(a_p\),其实这不影响,如果补了以后 \(a_{j-1}\) 有剩余,实际上在之前求解就会补上,不存在在后来再补。如果没有剩余,这种解会枚举的时候 \(i\) 到 \(g(p<g<j)\) 时满足这种情况,所以穷举的方法使得算法正确。

然后利用 \(O(n)\) 验证贪心的步数是否大于刚刚拼凑的总步数即可。

最后对于每个可行解,取最小值。

时间复杂度:\(O(n^3)\)。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=405;
int n,a[N],ans=2e9+5;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			int num=a[i]-1,sum=0;
			for(int k=i+1;k<=j;k++)
			{
				sum+=num/a[k];
				num%=a[k];
			}
			int lim=a[i]-1-num+a[j];
			sum++;
			int tot=0;
			for(int k=1;k<=n;k++)
			{
				tot+=lim/a[k];
				lim%=a[k];
			}
			if(sum<tot)ans=min(ans,a[i]-1-num+a[j]);
		}
	}
	if(ans==2e9+5)ans=-1;
	printf("%d",ans);
	return 0;
}

标签:那么,int,题解,CF10E,选取,余数,我们,Change,贪心
From: https://www.cnblogs.com/gmtfff/p/cf10e.html

相关文章

  • P2161 [SHOI2009]会场预约 题解
    没事打了个Splay,然后调了3h。觉得题解的找前驱后继与删除复杂了点,主要讲一下这的思路。由于平衡树中每一个点代表的区间互不相交,所有平衡树满足\(l,r\)两个值的BST。......
  • P3224 [HNOI2012]永无乡 题解
    典型Splay练习题。开始建\(n\)个Splay,每一次建边用并查集判断是否在一个子图,不在就合并,即把一个Splay的所有点全插入到另一个Splay中,需要合并的点可以用vector存储。但......
  • P1763 埃及分数 题解
    做完后发现很多题解都是有些细节问题的,对于向上与向下取整非常混乱。第一次做迭代加深搜索的题,记录一下。所谓迭代加深搜索,就是在求搜索树的深度的问题中,枚举层数,取最优......
  • P4048 [JSOI2010]冷冻波 题解
    首先很好想到我们应该预处理出来每一个巫妖王能攻击到的精灵。那么这就是一个几何题。对于每一组精灵与巫妖王,设巫妖王坐标为\((x_1,y_1)\),精灵坐标为\((x_2,y_2)\)。......
  • P7221 [JSOI2010] 蔬菜庆典 题解
    本题解在求无解的情况下优化了下。通过分析样例,我们可以发现如果一个节点有多个Dlihc,那么这些Dlihc对应的权值必须一样,否则可以无限延伸下去。因为一号节点没有Tnera......
  • P3195 [HNOI2008]玩具装箱 题解
    首先先写dp方程非常简单\(\mathit{f}_{i}=\min(\mathit{f}_{j}+(\mathit{c}_{i}+i-j-1-L-\mathit{c}_{j})^2)\)(其中\(\mathit{c}_{i}\)表示长度前缀和)然后发现括号......
  • U259394 Gmt丶FFF 的基环树 题解
    题目链接:传送门之所以评黑,是因为实在是太难调了。(又回调了)。对于有$40%$的数据,$n\le3000$,这部分我们可以暴力删边,然后暴力求直径即可。那么对于$100%$的数据:首先......
  • P3977 [TJOI2015]棋盘 题解
    前制知识引导状态压缩动态规划:[P1896[SCOI2005]互不侵犯](https://www.luogu.com.cn/problem/P1896)矩阵加速优化:[P1962斐波那契数列](https://www.luogu.com.cn/prob......
  • vscode格式化和保存代码与eslint有冲突问题解决(亲测有效)
    1.问题描述vscode安装了eslint插件,在使用Vue的时候格式化和保存代码都会爆红2.原因因为在使用Vue进行开发我们一般都安装了Vetur插件来对.vue文件进行处理,Vetur自带了......
  • 云原生|kubernetes|CKA真题解析-------(6-10题)
    第六题:service配置 解析:考察两个知识点:deployment控制器内的port命名暴露一个pod内的端口到新建的服务内的这里有一个需要注意的地方,没有告诉你deployment控制器在哪个name......