算法手记3
🦄个人主页:修修修也
🎏所属专栏:刷题
⚙️操作环境:牛客网
目录
一.dd爱框框
题目详情:
题目思路:
解题代码:
二.除2!
题目详情:
题目思路:
解题代码:
结语
一.dd爱框框
牛客网题目链接(点击即可跳转):dd爱框框
题目详情:
本题详情如下图:
题目思路:
本题解题思路如下:
滑动窗口!双指针一个left,一个right,同向向后滑动即可.窗口大于x就缩紧left向后移动,窗口小于x就扩大right向后移动.注意,left的下标从0开始,输出位置时要加1,right表示的是和left的相对距离,所以输出时不用加1.思路图示如下:
解题代码:
本题解题代码如下:
#include<iostream> #include<vector> using namespace std; int main() { //滑动窗口,同向双指针 //输入数据 int n,x; cin>>n>>x; vector<int> vi; vi.resize(n); for(int i=0;i<n;i++) { cin>>vi[i]; } //开始解题 int left=0,right=0; int min_left=0,min_right= n; int sum=0; while(left<n && right<n && left<=right) { if(sum<x) { //扩大窗口 sum+=vi[right]; right++; } else { //如果新窗口长度比老窗口小,就更新最小区间 if((right-left) < (min_right-min_left)) { min_right=right; min_left=left; } //缩小窗口 sum-=vi[left]; left++; } } cout<<min_left+1<<" "<<min_right; return 0; }
二.除2!
牛客网题目链接(点击即可跳转):除2!
题目详情:
本题详情如下图:
题目思路:
本题解题思路如下:
一开始输入的时候把奇数直接加到sum里,偶数直接push进大根堆,后面循环k次(条件是堆不为空)把堆顶的数据除2,堆顶除2后还是偶数就继续push进堆,如果不是偶数就直接加进sum.循环完毕把堆里剩下的偶数加进sum后输出即可.
解题代码:
本题解题代码如下:
#include<iostream> #include<queue> using namespace std; int main() { int n,k,tmp; long long sum; cin>>n>>k; priority_queue<int> pq; for(int i=0;i<n;i++) { cin>>tmp; if(tmp%2==0) pq.push(tmp); else sum+=tmp; } for(int i=0;i<k;i++) { if(pq.empty()) break; tmp = pq.top()/2; pq.pop(); if(tmp%2==0) pq.push(tmp); else sum+=tmp; } while(!pq.empty()) { sum+=pq.top(); pq.pop(); } cout<<sum; return 0; }
结语
说点啥好呢...这两道题都不难,主要是手生,一时半会就ac不出来,有思路可以,下次画个图可能会更直观明了一点.以及之前手撕的STL没想到还有漏网之鱼,后续有空记得补一篇优先级队列的使用说明手册哈.