题解 P6485 [COCI2010-2011#4] PROSJEK
1.题解 P7763 [COCI2016-2017#5] Ronald2.题解 P6497 [COCI2016-2017#2] Prosječni3.题解 P7537 [COCI2016-2017#4] Rima4.题解 P8017 [COCI2013-2014#4] UTRKA5.题解 P7751 [COCI2013-2014#2] PUTNIK6.题解 P7752 [COCI2013-2014#2] PALETA7.题解 P7586 [COCI2012-2013#1] SNAGA
8.题解 P6485 [COCI2010-2011#4] PROSJEK
9.题解 P6447 [COCI2010-2011#1] ŽABE10.题解P6677 [COCI2019-2020#2] Checker11.题解P8073 [COCI2009-2010#7] BAKICE12.题解P8084 [COCI2011-2012#4] BROJ13.题解P6370 [COCI2006-2007#6] KAMEN14.题解 P7165 [COCI2020-2021#1] Papričice15.题解 P9911 [COCI 2023/2024 #2] Kuglice16.题解 P6356 [COCI2007-2008#3] CUDAK17.题解 P7309 [COCI2018-2019#2] Kocka18.题解 P6548 [COCI2010-2011#2] IGRA19.题解 P6491 [COCI2010-2011#6] ABECEDA洛谷。
题意
选出若干个在
问选出的数最小的方案数。
分析
我们可以发现
我们就有了两个方式,第一种是使其平均数不断接近
第二种,我们凑出最小的
要使
我们的
此时,我们的
int cnt=1000000000; P*=cnt; int T=P,gcd=__gcd((int)P,cnt); T/=gcd,cnt/=gcd;
此时,我们找到了我们的最小
我们可以用背包解决,但是
我们可以找到在当前
怎么做呢,我们从最大选起,能选就选,就能得到我们的
我们思考一下为什么。
令
int tot=0; for(int i=5;i;--i) { a[i]=T/i; T=T-i*a[i]; tot+=a[i]; }
这时,我们的
我们需要使数量增加。
显然,我们需要使一些数分裂成更多的数。
为了使我们的分解更加便于操作,我们可以从最大开始,不断分出
从小开始也可行,但是因为我们上面是从大选起,能选就选,因此,只有
在正确性上,只要我们存在方案,那么我们必然可以凑出,因为我们是一步一步加的。
while(tot<cnt) { int id=0; for(int i=2;i<=5;++i) if(a[i]) id=i; int dt=cnt-tot; if(a[id]>=dt) { a[id]-=dt; a[1]+=dt; a[id-1]+=dt; tot+=dt; }else { a[1]+=a[id]; a[id-1]+=a[id]; tot+=a[id]; a[id]=0; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!