int cmp(const void* a, const void* b) { int* a1 = (int*)a; int* b1 = (int*)b; return b1 - a1; } class Solution { public: long long maxKelements(int nums, int numsSize, int k) { long long ans; qsort(nums, numsSize, sizeof(nums[0]), cmp); ans = (long long)nums[0]; nums[0] = (int)ceil((double)nums[0] / 3.0); int pos = 1 % numsSize; for (int i = 1; i < k; i++) { if (nums[pos] >= nums[0]) { ans += (long long)nums[pos]; nums[pos] = (int)ceil((double)nums[pos] / 3.0); pos = (pos + 1) % numsSize; } else { qsort(nums, numsSize, sizeof(nums[0]), cmp); ans += (long long)nums[0]; nums[0] = (int)ceil((double)nums[0] / 3.0); pos = 1 % numsSize; } } return ans; } }; int main() { Solution sol; int n, k; cin >> n; int input = (int*)malloc(sizeof(int) * n); for (int i = 0; i < n; i++) { cin >> input[i]; } cin >> k; cout << sol.maxKelements(input, n, k) << endl; }程序设计思路详细解释
时间: 2023-06-24 20:03:54 浏览: 146
浅析A*算法在搜索最短路径的应用
这段程序的作用是找出数组中前k大的元素,并且对每个元素进行一定的计算,最后返回计算结果的总和。
具体的实现步骤如下:
1. 定义一个比较函数cmp,用于在qsort函数中进行排序。排序方式是按照从大到小的顺序进行排列。
2. 定义一个Solution类,并且编写maxKelements函数,该函数有三个参数:nums,numsSize和k。nums是一个整数数组,numsSize表示数组的长度,k表示要找出前k大的元素。函数返回一个long long类型的结果。
3. 首先对数组进行排序,这样数组中最大的元素就在第一个位置上。
4. 将数组中第一个元素的值赋给ans变量。
5. 将数组中第一个元素的值除以3,向上取整,并且将结果存储在nums[0]中。
6. 定义一个pos变量,用于记录当前处理到数组中的哪个位置。
7. 通过一个for循环,找出前k大的元素。在循环中,判断当前位置的元素是否大于等于nums[0],如果是,就将该元素加入到ans中,并且将该元素除以3,向上取整,然后存储在nums[pos]中。否则,就重新排序数组,并且将排序后的第一个元素加入到ans中,然后将该元素除以3,向上取整,并且存储在nums[0]中。最后,更新pos变量的值,使其指向下一个位置。
8. 返回ans变量的值。
在主函数中,首先创建一个Solution对象sol,然后输入n和k的值,接着创建一个大小为n的整型数组input,并且从键盘读入n个整数。最后,调用sol的maxKelements函数,将input、n和k作为参数传递进去,并且输出函数返回的结果。
阅读全文