题目描述:
给定三个整数X,Y,Z,要求进行若干次操作使得X,Y,Z相等,操作有两种:
1.从X,Y,Z中选择两个数都加1。
2.从X,Y,Z中选择一个数加2。
求最少需要多少次操作。
题目思路:
1.对X,Y,Z三个数进行排序,此处用的是降序排序。假设排序完之后X>Y>Z,如果Y-Z是奇数的话,那么对Z进行(Y - Z)/2次操作2的话,Z就会变成了Y-1了,即此时的Y=Y,Z=Y-1。那么此时只需先对Y,Z进行X-Y次操作1,使得X=X,Y=X,Z=X-1。然后再对X,Y进行1次操作1,最后再对Z进行一次操作2.最后X=Y=Z。这种情况下,共需要X - Y +(Y - Z)/2 + 2次操作。
2.如果Y-Z是偶数的话,那么对Z进行(Y - Z)/2次操作2的话,Z就变成了Y了,即此时Y = Y,Z = Y。那么此时只需对Y,Z进行X - Y次操作1即可。这种情况下,共需要X - Y +(Y - Z)/2次操作。
代码如下:
#include<iostream> #include<cassert> #include<vector> #include<stack> #include<cstdio> #include<unordered_map> #include<queue> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; class Solution { public: int minCount(int a[]) { int x = a[0],y = a[1],z = a[2]; if((y - z) & 1) { return x - y + (y - z) / 2 +2; } else { return x - y + (y - z) / 2; } } }; bool cmp(int a,int b) { return a > b; } int main() { int a[]={2,9,5};//测试用例 Solution s; sort(a,a+3,cmp); cout<<s.minCount(a)<<endl;; }