2022天梯赛

插松枝

模拟

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值