夯实基础——P2705 小球
题目链接:https://www.luogu.org/problem/P2705
P2705 小球
题目描述
有 R 个红色盒子和 B 个蓝色盒子,还有 R 个红色小球和 B 个蓝色小球。每个盒子只能装一个小球,每个小球都要放在一个盒子里。
如果把一个红色小球放在一个红色盒子里,那么得分是 C。如果把一个蓝色小球放在一个蓝色盒子里,那么得分是 D。如果把一个红色小球放在一个蓝色盒子里,那么得分是 E。如果把一个蓝色小球放在一个红色盒子里,那么得分也是 E。
现在给出 R,B,C,D,E。应该如何放置这些小球进盒子,才能使得总得分最大?输出最大的总得分。
输入格式
一行,5 个整数,分别是 R,B,C,D,E。
输出格式
一个整数,最大总得分。
输入输出样例
2 3 100 400 200
1400
2 3 100 400 300
1600
说明/提示
【数据规模】
1 ≤ R ≤ 100,1 ≤ B ≤ 100, -1000 ≤ C,D,E ≤ 1000。
这道题是一道简单的数论题,其实规律听好想的,既然红球和蓝球放入不同的箱子里得分相同,那么就可以把他们看成一个整体,比较“放入不同箱子的的得分值+余下球放入属于自己的箱子的得分值”和“全放入自己箱子的得分值” 的大小。而这,一定是正确的解法。
如果不相信,那么下面我们用反证法来证明已下:
假设:上述解法不是最优解,那么必然有一种情况使得分值大于上述两种情况,且蓝球和红球不能完全放入各自和对方的箱子。那么如果要满足上述情况,其前提条件就是“c+d>e+e”,那么我们就可以进行下一步的讨论了。
既然蓝球和红球不能完全放入对方的箱子,那么必然会出现一中情况:
“min( r , b ) * e * 2 > N * e * 2 (N < min( r , b ) ) ”,
那么既然假设的情况是最优解,所以
“min( r , b ) * e * 2 + ( max( r , b ) - min( r , b ) ) * m < N * e * 2 + R * c + B * d (N < min( r , b ) , R,B是剩余的蓝球和红球 , m是放入自己球栏的分值c/d) ”,
那么就可以进一步推出
“ k * e * 2 + ( max( r , b ) - min( r , b ) ) * m < min( R , B ) * (c + d) + ( max( R , B ) - min( R , B ) ) * m (k是 min( r , b ) - N) ”
到此,可以看出
“ min( r , b ) ) * m ” == “ ( max( R , B ) - min( R , B ) ) * m ”,
所以不等式就可以变成 k * e * 2 < min( R , B ) * (c + d)
又因为“ min( r , b ) * e * 2 > N * e * 2 (N < min( r , b ) ) ” 且( k > min( R , B ) )
所以不等式不成立,即上述情况不是最优解。
综上所述:
“ 比较“放入不同箱子的的得分值+余下球放入属于自己的箱子的得分值”和“全放入自己箱子的得分值” 的大小 ” 是最优解。
1 #include <iostream> 2 3 using namespace std; 4 5 int a,b,c,d,e,ans; 6 7 bool f; 8 9 int main() 10 { 11 cin>>a>>b>>c>>d>>e; 12 if(a>b) f=true; 13 if(c+d>e+e) ans=a*c+b*d; 14 else 15 { 16 if(f) ans=b*e*2+(a-b)*c; 17 else ans=a*e*2+(b-a)*d; 18 } 19 cout<<ans<<endl; 20 }
夯实基础,认真做好每一道题!!!
作者:Gmax
本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ
2019-08-11