思想 :
抽象出来一个例子 : 合并k个长度相等升序列表 :
抽象成一张表也就是 :
做法 : 用一个小根堆来维护 , 首先将每个序列的第一个元素放入队列中 , 然后模拟,每次取出队头,作为结果序列的下一个元素 , 然后向堆中存入该元素序列中的下一个元素 ,直到所有元素取完为止;
例题 :
1262 - 鱼塘钓鱼
c++代码 :
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110 ;
typedef pair<int, int> PII;
int a[N] , b[N] , c[N] ;
int n , T ;
int main(){
cin >> n ;
for(int i=1;i<=n;i++) cin >> a[i] ;
for(int j=1;j<=n;j++) cin >> b[j] ;
for(int k=2;k<=n;k++) cin >> c[k] , c[k] += c[k-1] ;
cin >> T ;
int ans = 0 ;
// 只在前k个池塘钓鱼
for(int i=1;i<=n;i++){
int t = T - c[i] ; // 本次钓鱼专用时间
priority_queue<PII> que ;
for(int j=1;j<=i;j++) que.push({a[j],j}) ;
int res = 0 ;
while(!que.empty() && t > 0){
auto it = que.top() ; que.pop() ;
int x = it.first , idx = it.second ; // 获取元素和下标
res += x ;
int xx = x - b[idx] ;
if(xx > 0) que.push({xx , idx}) ;
t -- ;
}
ans = max(ans , res) ;
}
cout << ans << endl ;
}
62 . 丑数
class Solution {
public:
int getUglyNumber(int n) {
if(n <= 1) return n;
vector<int> f(1,1);
int i = 0, j = 0, k = 0;
long long t = 0;
while(--n)
{
t = min(f[i] * 2, min (f[j] * 3, f[k] * 5));
if(t == f[i] * 2) i++;
if(t == f[j] * 3) j++;
if(t == f[k] * 5) k++;
f.push_back(t);
}
return f.back();
}
};