不满度并不是单调递增的
时间: 2023-08-01 21:14:14 浏览: 37
是的,不满度并不一定单调递增。在某些情况下,增加某些因素可能会导致不满度的减少,这可能是因为不满度是由多种因素共同影响的结果。例如,在购买商品时,增加商品的种类和选择可能会导致不满度的减少,因为顾客会有更多的选择,并且能够更好地满足他们的需求。但是,在其他情况下,增加某些因素可能会导致不满度的增加,这取决于具体的情况。
相关问题
不满度并不是简单单调递增的,所以不能如此二分
是的,你说得对。因为不满度并不是简单单调递增的,所以我们需要进行一些修改,使得该算法能够正确地找到不满度最小的价格。
具体来说,我们需要考虑以下三种情况:
1. 如果 mid 的不满度小于 ans,那么更新 ans 的值为 mid 的不满度。
2. 如果 mid 的不满度等于 ans,那么更新 ans 的值为 min(ans, mid)。
3. 如果 mid 的不满度大于 ans,那么在 mid 的左侧或右侧继续查找。
下面是修改后的 C++ 代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
int getUnsatisfaction(int price) {
string s = to_string(price);
while (s.back() == '0') {
s.pop_back();
}
int len = s.length();
if (s.back() == '5') {
return 2 * len - 1;
}
return 2 * len;
}
int main() {
int L, R;
cin >> L >> R;
int ans = -1;
int left = L, right = R;
while (left <= right) {
int mid = left + (right - left) / 2;
int unsatisfaction = getUnsatisfaction(mid);
if (unsatisfaction < ans || ans == -1) {
ans = unsatisfaction;
} else if (unsatisfaction == ans) {
ans = min(ans, unsatisfaction);
}
if (mid > L && getUnsatisfaction(mid - 1) <= unsatisfaction) {
right = mid - 1;
} else if (mid < R && getUnsatisfaction(mid + 1) <= unsatisfaction) {
left = mid + 1;
} else {
break;
}
}
cout << ans << endl;
return 0;
}
```
在上述代码中,我们首先将 ans 的初始值设置为 -1,表示还没有找到最小的不满度。然后在每次二分时,根据 mid 的不满度更新 ans 的值。如果 mid 的不满度小于 ans,那么更新 ans 的值为 mid 的不满度;如果 mid 的不满度等于 ans,那么更新 ans 的值为 min(ans, mid);如果 mid 的不满度大于 ans,那么在 mid 的左侧或右侧继续查找。
最后输出 ans 的值,即为不满度最小的价格。
单调递增最大子序列代码
以下是使用动态规划的单调递增最大子序列的代码:
```python
def longest_increasing_subsequence(nums):
if not nums:
return 0
# dp[i]表示以nums[i]结尾的最长递增子序列的长度
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
```
时间复杂度:$O(n^2)$
可以通过使用二分查找优化到$O(nlogn)$的时间复杂度,以下是优化后的代码:
```python
def longest_increasing_subsequence(nums):
if not nums:
return 0
# tails[i]表示长度为i+1的递增子序列的最后一个元素的最小值
tails = [nums[0]]
for num in nums[1:]:
if num > tails[-1]:
tails.append(num)
else:
left, right = 0, len(tails) - 1
while left < right:
mid = (left + right) // 2
if tails[mid] < num:
left = mid + 1
else:
right = mid
tails[left] = num
return len(tails)
```
时间复杂度:$O(nlogn)$