第一题:没啥思路,该用什么函数就用什么函数;
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{
priority_queue<int> a;
string s;
while(true)
{
cin>>s;
int k;
if(s=="end")break;
else if(s=="insert")
{
cin>>k;
a.push(k);
}
else if(s=="extract")
{
if(!a.empty())
{
int p=a.top();
cout<<p<<endl;;
a.pop();
}
}
}
return 0;
}
第二题:st表硬套,注意最后用printf(“%d\n”)
#include<iostream>
#include<vector>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
const int N=1e5;
int main()
{
int n,m;
n=read();
m=read();
vector<int> a;
for(int i=0;i<n;i++)
{
int num;
num=read();
a.push_back(num);
}
int log_2[n+1];
log_2[1]=0;
for(int i=2;i<=n;i++)
{
log_2[i]=log_2[i/2]+1;
}
vector<vector<int> > b(n,vector<int>(log_2[n]+1));
for(int i=0;i<n;i++)
{
b[i][0]=a[i];
}
for(int j=1;j<=log_2[n];j++)
{
for(int i=0;i+(1<<j)-1<n;i++)
{
b[i][j]=max(b[i][j-1],b[i+(1<<(j-1))][j-1]);
}
}
int l,r;
for(int i=0;i<m;i++)
{
l=read();
r=read();
l--;
r--;
int s=log_2[r-l+1];
int k=max(b[l][s],b[r-(1<<s)+1][s]);
printf("%d\n",k);
}
return 0;
}
第三题:用小顶堆,依次队首元素两回,再相加后重新插入小顶堆,循环,注意结果sum是多次两回相加的总和
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n;
cin>>n;
priority_queue<int,vector<int>,greater<int> >a;
for(int i=0;i<n;i++)
{
int num;
cin>>num;
a.push(num);
}
int sum=0;
int count=0;
while(a.size()>1)
{
int k=0;
int one=a.top();
a.pop();
int two=a.top();
k=one+two;
a.pop();
sum+=k;
a.push(k);
}
cout<<sum;
return 0;
}
第四题:用队列承接小朋友序号,用for循环m次,到m之前把队首元素移除在插入队列末尾,到m则输出该位置的小朋友序号,并移除该元素,并一直循环到队列大小为零
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
queue<int> a;
for(int i=1;i<=n;i++)
{
a.push(i);
}
/*while(a.size()>0)
{
cout<<a.front();
a.pop();
}*/
while(a.size()>0)
{
for(int i=1;i<=m;i++)
{
if(i<m)
{
a.push(a.front());
a.pop();
}
else if(i==m)
{
cout<<a.front();
a.pop();
}
}
if(a.size()>0)cout<<" ";
}
return 0;
}
第五题:用栈的特性;
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> h;
vector<int> ans(n,0);
stack<int> st;
for(int i=1;i<=n;i++)
{
int num;
cin>>num;
h.push_back(num);
}
for(int i=0;i<n;i++)
{
while(!st.empty()&&h[st.top()]<h[i])
{
ans[st.top()]=i+1;
st.pop();
}
st.push(i);
}
for(int i=0;i<n;i++)
{
cout<<ans[i];
if(i<n-1)cout<<endl;
}
return 0;
}