Div.3 CF 1114A题(排序,贪心)

发布时间:2026/11/6 10:12:29
Div.3 CF 1114A题(排序,贪心)

题目链接:https://codeforces.com/contest/2254/problem/A

题目大意:三人初始各有 `a、b、c` 个代币;若出现两人数量相同则结束,

否则最多者给最少者1个,重复直到有人数量相同,求进行的轮数。

题目思路:我们可以定义一个长度为三的数组,将a,b,c分别输入后进行排序,那么此时就会有v[0]<=v[1]<=v[2],如果说一开始v[0]==v[1]或者v[1]==v[2],那么直接输出0,否则我们看v[0]和v[2]分别到达v[1]需要多少代币,并且取最小值,这个最小值就是需要求的轮数了,因为在这个过程中v[0]在增大,v[2]在减小,只有v[1]是个定值

时间复杂度:O(T*3log3)

代码如下:

#include <bits/stdc++.h> using namespace std; #define endl "\n" using ll = long long; using ld = long double; /* https://codeforces.com/contest/2254/problem/A Div.3 CF 1114A题(排序,贪心) 题目大意:三人初始各有 `a、b、c` 个代币;若出现两人数量相同则结束, 否则最多者给最少者1个,重复直到有人数量相同,求进行的轮数。 题目思路:我们可以定义一个长度为三的数组,将a,b,c分别输入后进行排序,那么此时就会有v[0]<=v[1]<=v[2], 如果说一开始v[0]==v[1]或者v[1]==v[2],那么直接输出0,否则我们看v[0]和v[2]分别到达v[1]需要多少代币, 并且取最小值,这个最小值就是需要求的轮数了,因为在这个过程中v[0]在增大,v[2]在减小,只有v[1]是个定值 时间复杂度:O(T*3log3) */ void solve() { vector<int> v(3); for (int i = 0; i < 3; i++) { cin >> v[i]; } sort(v.begin(), v.end());//从小到大排序 int cnt = 0; if (v[0] == v[1] || v[1] == v[2])//任意一种情况相等均输出0 { cout << cnt << endl; return; } int mid1 = v[1] - v[0];//v[0]到达v[1] int mid2 = v[2] - v[1];//v[2]到达v[1] cnt = min(mid1, mid2);//取最小操作次数 cout << cnt << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { solve(); } return 0; }