输入样例:
8 3 4
20 25 15 18 20 18 8 5
输出样例:
20 15
20 18 18 8
25 5
AC代码
#include<bits/stdc++.h>
using namespace std;
stack<int>box;
vector<int>succ;
queue<int>con;
int n,m,k,i;
void coutt()
{
for( i =0; i<succ.size()-1; i++)
cout<<succ[i]<<" ";
cout<<succ[i]<<endl;
succ.clear();
}
int main()
{
cin>>n>>m>>k;
int mark=0;
while(n--)
{
int x;
cin>>x;
con.push(x);
}
while(!con.empty())
{
//小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。
if(!box.empty()&&!succ.empty())
if(box.size()==m&&box.top()>succ.back()&&con.front()>succ.back())
coutt();
if(succ.size()==k)//手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
coutt();
if(succ.empty())
{
if(box.empty())
{//box里面没树叶,从传送带上拿;
succ.push_back(con.front());
con.pop();
}
else
{//box里有值,循环从box里取树叶;
while(1)
{
if(succ.size()==k)
{
coutt();break;
}
if(!succ.empty())
{//如果succ不为空
if(succ.back()>=box.top())
{
succ.push_back(box.top());
box.pop();
}
else//box里的不满足退出循环,从传输带上取树叶;
break;
}
else
{//如果succ为空;
succ.push_back(box.top());
box.pop();
}
if(box.size()==0)//连续从box里面取值,防止取空;
break;
}
}
}
else
{//不为空的时候,不用考虑从box里取值;直接从传送带上取;
if(succ.back()>=con.front())
{
succ.push_back(con.front());
con.pop();
}
else
{
box.push(con.front());
con.pop();
}
}
}
//小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。
if(succ.size()>0&&!box.empty())
coutt();
//清空box
while(!box.empty())
{
if(succ.size()==k)//手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
coutt();
if(succ.empty())
{
succ.push_back(box.top());
box.pop();
}
else
{
if(succ.back()>=box.top())
{
succ.push_back(box.top());
box.pop();
}
else
coutt();
}
}
//输出最后一个
if(succ.size()>0)
coutt();
return 0;
}
L2-042 老板的作息表
输入样例:
8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00
输出样例:
04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59
AC代码
#include<bits/stdc++.h>
using namespace std;
struct in
{
string s1,s2;
}frontt;
int n;
vector <struct in>ans;
int cmp(struct in a,struct in b)
{
return a.s1<b.s1;
}
int main()
{
cin>>n;
while(n--)
{
cin>>frontt.s1;
scanf(" - ");
cin>>frontt.s2;
ans.push_back(frontt);
}
sort(ans.begin(),ans.end(),cmp);
if(ans[0].s1!="00:00:00")
cout<<"00:00:00"<<" - "<<ans[0].s1<<endl;
for(int k=1;k<ans.size();k++)
if(ans[k].s1!=ans[k-1].s2)
cout<<ans[k-1].s2<<" - "<<ans[k].s1<<endl;
if(ans[ans.size()-1].s2!="23:59:59")
cout<<ans[ans.size()-1].s2<<" - "<<"23:59:59"<<endl;
return 0;
}
L2-043 龙龙送外卖
输入样例:
7 4
-1 1 1 1 2 2 3
5
6
2
4
输出样例:
2
4
4
6
AC代码
#include<bits/stdc++.h>
using namespace std;
set<int>sett;
int n,m;
int deep[100001]= {0};
int fa[100001];
int maxx;
void findd(int x)
{
if(sett.find(x)!=sett.end())//遇到之前走过的点就不往下走了
{
deep[x]=deep[ fa[x] ]+1;//记录深度
return ;
}
sett.insert(x);//记录经过节点数,去重
if(fa[x]==-1)
{
deep[ x ]=1;
return ;
}
else
{
findd( fa[x] );
deep[x]=deep[ fa[x] ]+1;//回溯的时候记录深度
}
}
int main()
{
cin>>n>>m;
deep[1]=1;
for(int i=1; i<=n; i++)
{
int x;
cin>>x;
fa[i]=x;
}
while(m--)
{
int x;
cin>>x;
findd(x);
maxx=max(maxx,deep[x]-1);
cout<<(sett.size()-1)*2-maxx<<endl;
}
return 0;
}
L2-044 大众情人