基于刚刚说过的单调队列pop和push的规则,代码不难实现,如下:
滑窗用一个单调队列维持

同理实现acm滑窗最小
C++代码如下:
#include <iostream>
#include <vector>
#include <deque>
#include <sstream>
#include <algorithm>
using namespace std;
int main() {
string line;
getline(cin, line); // 第一行:crossroads[]
stringstream ss(line);
vector<int> crossroads;
int x;
while (ss >> x) {
crossroads.push_back(x);
}
int k;
if (!(cin >> k)) {
cout << -1 << endl;
return 0;
}
int n = crossroads.size();
if (k < 1 || n < 1 || k > n) {
cout << -1 << endl;
return 0;
}
vector<int> result;
deque<int> que; // 单调递增队列,存下标
int l = 0, r = 0;
for (int i = 0; i < n - 1; ++i) {
int left = max(0, i - k);
int right = min(n - 1, i + k);
// 移动右边界
while (r <= right) {
while (!que.empty() && crossroads[r] < crossroads[que.back()]) {
que.pop_back();
}
que.push_back(r);
++r;
}
// 移动左边界
while (!que.empty() && que.front() < left) {
que.pop_front();
}
result.push_back(que.front());
}
// 输出
for (int i = 0; i < result.size(); ++i) {
if (i > 0) cout << " ";
cout << result[i];
}
cout << endl;
return 0;
}
#include <iostream>
#include<vector>
#include<string>
#include<stringstream>
//动态规划
using namespace std;
int main() {
int n;
cin>>n;
vector<vector<int>> arr(n,n);
for(int i=0;i<n;i++){
string line;
getline(cin,line);
stringstream ss(line);
int j=0;
while(ss>>arr[i][j]){
j++;
}
}
string b;
getline(cin,b);
stringstream sb(b);
vector<int> gates;
int x=0;
while(ss>>gates[x]){
x++;
}
int in,out;
cin>>in>>out;
}
// 64 位输出请用 printf("%lld")
图论中的 dijsktra最短路径
https://niumacode.com/problem/P1675
#include <iostream>
#include <sstream>
#include <vector>
#include <climits>
using namespace std;//dfs
int dij(vector<vector<int>> dis,int start ,int target){
int l=dis.size();
vector<int> mindist(l,INT_MAX);
vector<bool> visited(l, false); // 标记是否访问过
mindist[start]=0;
for(int i=0;i<l;i++){
int minval=INT_MAX;
int cur=0;
for(int p=0;p<l;p++){
if(!visited[p]&&mindist[p]<minval){
minval=mindist[p];
cur=p;
}//在每一轮选出最小
}
visited[cur] = true; // 2、标记该节点已被访问
// 3、第三步,更新非访问节点到源点的距离(即更新minDist数组)
for (int v = 0; v < l; v++) {
if (!visited[v] && dis[cur][v] != INT_MAX && mindist[cur] + dis[cur][v] < mindist[v]) {
mindist[v] = mindist[cur] + dis[cur][v];
}
}//在每一次访问一个点时,更新mindist,并记录已访问。它储存着每个点到v点从头开始便利的最段路径。
}
return mindist[target];
}
int main() {
int n,des;
cin>>n;
vector<vector<int>> dis(n+1,vector<int>(n+1,INT_MAX));
int temp;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
cin >> temp;
if (i == j) {
dis[i][j] = 0;
} else if (temp == 0) {
dis[i][j] = INT_MAX;
} else {
dis[i][j] = temp;
}
}
}
cin>>des;
int answer=dij(dis,0,des);
cout<<answer<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")
浙公网安备 33010602011771号