51nod1548-枚举&技巧&数学证明-欧姆诺姆和糖果

来源:互联网 发布:天眼通软件下载 编辑:程序博客网 时间:2024/06/04 20:04

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1548
开始搜了一下,wa了一半a了一半,得不到正确的结果。我是每次尽可能的拿比例大的,但是结果不一定,可能比例大的并不一定拿的尽可能的多。。
比例的意思是 价值比重量
证明,较少的糖果的数目一定小于sqrt(c)的就行(只是说取的数目,没说比例大小)。
证明如下。
假设比例小的的数目大于等于sqrt(c),那么他的质量肯定小于等于sqrt(c)。
存在两种情况
① 比例大的单个质量大于sqrt(c)
② 比例大的单个质量也小于sqrt(c)。
①的时候当第一种的时候,比例大的取的数目小于qsrt(c) 符合证明。
②的时候,这时俩的质量都小于sqrt(c),可能他们的数目都大于sqrt(c)啊。对吧??
不对呢,因为如果质量都小于qsrt(c),那么他们的lcm肯定小于c(最大的lcm也不过二者相乘。),这时候我们就可以再lcm的范围内进行 两个糖果的无限转换了。
我们可以 找一个 lcm的倍数,令其大于sqrt(c)并且小于c。
这时候,我们把比例小的都换成比例大的。这时候剩下的质量一定是
小于等于sqrt(c)
所以剩下的质量一定小于sqrt(c)了,那么质量比较小的一定小于sqrt(c)了

#include <bits/stdc++.h>using namespace std;/*  枚举,这个证明挺好的。    还看见别人瞎搞的a了。    就是看他们的数目是不是小于10000.*/typedef long long ll;ll c,c1,c2,a1,a2;int main(){    while(~scanf("%lld%lld%lld%lld%lld",&c,&c1,&c2,&a1,&a2)){           ll num=sqrt(c);           ll ans=-1;           for(ll i=0;i<=num;i++){               if(i*a1<=c){                 ans=max(ans,(c-a1*i)/a2*c2+i*c1);               }               if(i*a2<=c){                ans=max(ans,(c-a2*i)/a1*c1+i*c2);               }           }           printf("%lld\n",ans);     }    return 0;}