牛客网题目链接(点击即可跳转):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!
本题详情如下图:
本题解题思路如下: 一开始输入的时候把奇数直接加到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没想到还有漏网之鱼,后续有空记得补一篇优先级队列的使用说明手册哈.