插松枝
模拟
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
queue<int> pu;
stack<int> box;
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
pu.push(x);
}
int num=0,last=1000;
while(pu.size())
{
if(box.size()&&box.top()<=last)
{
if(num==0) cout<<box.top();
else cout<<' '<<box.top();
last = box.top();
num+=1;
box.pop();
}
else if(pu.front()<=last)
{
if(num==0) cout<<pu.front();
else cout<<' '<<pu.front();
last = pu.front();
num+=1;
pu.pop();
}
else if(box.size()<m)
{
box.push(pu.front());
pu.pop();
}
if(num==k||(box.size()==m&&pu.front()>last&&box.top()>last))//这里注意一下 不是盒子满了就会拿新的松枝,而是盒子满了且盒子以及推送器上的都不能继续插到松枝上
{
cout<<endl;
num=0;
last=1000;
}
}
while(box.size())
{
if(box.top()<=last&&num<k)
{
if(num) cout<<' '<<box.top();
else cout<<box.top();
last = box.top();
num+=1;
box.pop();
}
else
{
cout<<endl;
num=0;
last=1000;
}
}
return 0;
}
老板的作息表
模拟
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<pair<string,string>> s;
for(int i=0;i<n;i++)
{
string a,b,c;
cin>>a>>c>>b;
s.push_back({a,b});
}
sort(s.begin(),s.end());
string last="-1";
for(auto &p:s)
{
if(last=="-1")
{
last=p.second;
if(p.first!="00:00:00")
cout<<"00:00:00 - "<<p.first<<endl;
}
else
{
if(last==p.first) last=p.second;
else
{
cout<<last<<" - "<<p.first<<endl;
last=p.second;
}
}
}
if(last!="23:59:59") cout<<last<<" - 23:59:59"<<endl;
return 0;
}
龙龙送外卖
把深度记录,下次在访问到的时候就不用往下继续去找。
#include <iostream>
#include <set>
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;
}
大众情人
用Floyd求出所有人的最短路径存入 a[ i ][ j ]
求出每个女性,每个男性对她的最近距离的最远距离存入c[ i ]
输出女性b[ i ]的最小值的女性编号
同理输出男性编号
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=510,MOD=510000000;
int a[N][N],b[N],c[N];
int main()
{
int i,j,k,n,flag;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=MOD;
for(i=1;i<=n;i++)
{
char c1;
getchar();
scanf("%c %d",&c1,&k);
if(c1=='F') b[i]=1;
if(k!=0)
{
while(k--)
{
int a1,a2;
scanf("%d:%d",&a1,&a2);
a[i][a1]=a2;
}
}
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
}
}
for(i=1;i<=n;i++)
{
c[i]=0;
for(j=1;j<=n;j++)
{
if(b[i]==b[j]) continue;
c[i]=max(c[i],a[j][i]);
}
}
int man,wom;
man=wom=MOD;
for(i=1;i<=n;i++)
{
if(b[i]) man=min(man,c[i]);
else wom=min(wom,c[i]);
}
flag=1;
for(i=1;i<=n;i++)
{
if(b[i]==0) continue;
if(c[i]==man&&flag)
{
printf("%d",i);
flag--;
}
else if(c[i]==man) printf(" %d",i);
}
printf("\n");
flag=1;
for(i=1;i<=n;i++)
{
if(b[i]) continue;
if(c[i]==wom&&flag)
{
printf("%d",i);
flag--;
}
else if(c[i]==wom) printf(" %d",i);
}
return 0;
}