夯实基础——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。

输出格式

一个整数,最大总得分。

输入输出样例

输入 #1
2 3 100 400 200
输出 #1
1400
输入 #2
2 3 100 400 300
输出 #2
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

posted on 2019-08-11 11:08  Gmax  阅读(403)  评论(0编辑  收藏  举报