[LCP28] 采购方案
生活随笔
收集整理的這篇文章主要介紹了
[LCP28] 采购方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LCP 28 采購方案
1.題目
小力將 N 個零件的報價存于數組 nums。小力預算為 target,假定小力僅購買兩個零件,要求購買零件的花費不超過預算,請問他有多少種采購方案。
注意:答案需要以 1e9 + 7 (1000000007) 為底取模,如:計算初始結果為:1000000008,請返回 1
2.解題思路
從題目給的注意和數據量來看,暴力循環一定是不行的。因此代替暴力循環最常見的方法就是雙指針。
首先分析題目:輸入是數組和預算目標值。輸出的是數組中任意選取兩個數相加可以小于目標值的所有方案。因此很容易想到需要對數組做一次排序。
step1. 數組升序排序(qsort)
step2. 設置左指針在有序數組左端,右指針在有序數組右端
step3. 以左指針為外循環基準,左移右指針。當左指針 + 右指針的值恰好小于目標值時,從左指針到右指針之間的所有數據則都滿足要求,則統計完當前左指針下,滿足條件的方案。
step4. 然后右移一次左指針,右指針在當前位置下積蓄左移,重復step3統計累計所有方案(這時,右指針不需要從最右端重新再刷新了,因為左指針向右移動后,一定滿足 nums[left] + nums[right] <= nums[left + 1] + nums[right])
step5. 結束條件:當左指針和右指針相遇以后,左右指針之間的數據量為負數,則不符合常理,退出循環。
3.數據結構與算法
算法:排序算法+雙指針
4.排序算法 + 雙指針
int sort_up(const void *a, const void *b) {return *(int *)a - *(int *)b; } int purchasePlans(int* nums, int numsSize, int target){qsort(nums, numsSize, sizeof(nums[0]), sort_up);int left = 0;int right = numsSize - 1;long long sum = 0;while (left < right) {if (nums[right] + nums[left] > target)right--;else {sum += (long long)(right - left);left++;c}}sum = (int) (sum % (1000000007));return sum; }總結
以上是生活随笔為你收集整理的[LCP28] 采购方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器 性能监控软件,云监控 - 云应
- 下一篇: 电子计算机之父冯.诺依曼的主要贡献,冯•