现在给出三个数字a,b和c, 你可以在保证a+b不变的情况下对两数进行调整,设调整以后是a'和b',请问在使得 a’/c+b’/c(均为整数除法)最大的情况下,用C++代码写出求最小的|a'-a|+|b' -b|的方法
时间: 2024-03-22 18:38:27 浏览: 133
首先,我们可以通过简单的推导,得到一个结论:在保证a+b不变的情况下,a'和b'与a、b的差距最小,当且仅当它们与(a+b)/2的差距相等。
因此,我们可以先求出(a+b)/2,然后将其拆分为两个整数a1和a2(a1<=a2),使得a1+a2=(a+b)/2,然后分别将a和b调整为a'和b',使得它们与a1和a2的差距相等。具体地,我们可以有以下的代码实现:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int avg = (a + b) / 2; // 求出(a+b)/2
int a1 = avg / c * c, a2 = a1 + c; // 将(a+b)/2拆分为两个整数a1和a2
int a_diff1 = abs(a - a1), a_diff2 = abs(a - a2); // 求出a与a1、a2的差距
int b_diff1 = abs(b - (avg - a1)), b_diff2 = abs(b - (avg - a2)); // 求出b与b1、b2的差距
int a_new, b_new;
if (a_diff1 + b_diff1 <= a_diff2 + b_diff2) { // 情况1
a_new = a1;
b_new = avg - a1;
} else { // 情况2
a_new = a2;
b_new = avg - a2;
}
cout << abs(a_new - a) + abs(b_new - b) << endl; // 输出|a'-a|+|b'-b|
return 0;
}
```
需要注意的是,我们不能直接用(a+b)/2来代替a1和a2,因为它们可能不是整数。因此,我们需要先将它除以c取整,再乘以c,就可以得到最接近它且不超过它的整数a1,然后将a2设为a1+c即可。
阅读全文