1 条题解
-
0
P1041 solution
思路分析。
首先有两个位数相同的数 , 交换它们对应数位的上的数使 最大。
是个正常人都看得出来,这道题有一个关键的性质: a+b 不变。那它有什么用呢?
定理1:周长相同的矩形中,正方形面积最大。
也就是说,我们只需要让新的数字 相等就好了。
要是不相等呢?没有关系,可以让 成为两个数里面大的那个,只要它们的差最小就好了。
具体怎么做呢?
很简单,两个数字数位从高到低扫一遍,数字相同最好,如果出现了不相同的情况,就是第一次数字不同,就把 存数字较大的, 存数字小的,之后所有数位的操作反过来,即 存小的, 存大的,这样,可以使 且它们的差最小。代码实现
就知道你们爱看这个#include<iostream> #include<cstdio> #include<cmath> #include<string> //我是不会用万能头哒!!! using namespace std; #define int long long string a,b; //输入的数字 char a1,b1; //a,b当前数位上的值 int ia,ib; //转成数字的a,b bool equals=1; //两个数目前是否相等,默认为1 signed main() { cout<<"Created by _LogicFish_"<<endl; cin>>a>>b; //输入~ for(int i=0;i<a.size();i++) { a1=a[i],b1=b[i]; //记录当前数字 if(equals&&a1!=b1) //以前相同,从这一位开始不一样了 a[i]=max(a1,b1), b[i]=min(a1,b1); //见思路分析 else a[i]=min(a1,b1), b[i]=max(a1,b1); //见思路分析 if(a1!=b1) equals=0; //如果不一样,equals改变状态 //不知道为什么,写成equals=a1==b1就错了qwq } for(int i=0;i<a.size();i++) ia=ia*10+a[i]-'0'; for(int i=0;i<b.size();i++) ib=ib*10+b[i]-'0'; //将更新的字符串转成数字 cout<<ia*ib; //完美的输出~! return 0; }
附录
关于定理1:证明过程
设正方形的边长为 ,面积为 ,则正方形的面积为 。
设长方形形的长为 ,宽为 ,面积为 ,则矩形的面积 。
由于正方形与矩形的周长相等,所以,即
通过推导,可以得到
其中,$(\frac{1}{2}(b+c))^2=\frac{1}{4} \times (b^2+c^2+2bc)$ 带入得
$$S_1-S_2 = \frac{1}{4}(b^2+c^2)+\frac{1}{2}bc-bc\\ S_1-S_2 = \frac{1}{4}(b^2+c^2)-\frac{1}{2}bc\\ S_1-S_2 = \frac{1}{4}(b^2+c^2-2bc)\\ S_1-S_2 = \frac{1}{4}(b-c)^2 $$也就是说 !! 证毕。
信息
- ID
- 26
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 32
- 已通过
- 2
- 上传者