我最喜欢吃饭了(山东理工大学第十六届ACM程序设计竞赛 (同步赛)H题)

链接:https://ac.nowcoder.com/acm/contest/81509/H
来源:牛客网

题目描述

前情回顾:吃完了,有点撑,食堂门口蹲会消化消化,惊奇的发现我们的食堂居然有 m 个打饭窗口!

那天我蹲在食堂门口看着人来人往,但是因为我不认识他们,所以我只能按照他们进食堂的顺序给他们每一个人编了个号。

已知:如果两个人编号分别为 i 和 j 并且有 i<j ,那么 i 一定比 j 先进入食堂,并且 i 一定比 j 先排上队。而且因为当年是疫情(别问我为什么疫情还蹲在食堂门口),不能食堂就餐,打完餐就走了,所以如果 i 和 j 排的是同一个打餐窗口,那么 i 一定比 j 先从食堂出来。

至于他们进去以后是怎么排队的,我只知道他们会从 m 个窗口挑一个,却不知道他们具体排的是哪一个窗口,因为我蹲在门口看不清里面。 

最后我又看到他们打完饭出来并记住了每个人出来的顺序,消化完了以后我回到宿舍,把这个故事讲给了宿舍的集训队大佬 Karashi,他却说我吃饱了撑得编故事消遣他,还告诉我,n 个人 m 个打饭窗口大家离开食堂的顺序根本不可能是这样。

难道真的是我记错了?聪明的你能告诉我 Karashi 是不是在骗我吗?

简单来讲,就是编号为 1∼n 的人依次按照 1∼n 的顺序随机进入 m 个队列。现在给定出队序列,判断是否合法,如果合法输出 Karashi cblcd,否则输出 Karashi lovelove
 

输入描述:

输入的第一行包含两个整数 n,m (1≤n,m≤5×10^3)

输入的第二行包含 n 个正整数 ai (1≤ai≤10^9)

输出描述:

如果 Karashi 没骗我,我真的记错了,n 个人 m 个打饭窗口大家离开食堂的顺序根本不可能是这样,请输出 Karashi lovelove,反之则输出 Karashi cblcd

示例

输入

3 1
2 1 3

输出

Karashi lovelove

思路:

        根据题意易知,总共有n个人排m条队,判断是否存在这m条队列使得n个人能按输入数据中的顺序出队(队列与队列之间的元素出队顺序无要求),由已知得每条队的顺序按照从小到大的顺序排(队头到队尾)。

        因为队列与队列之间的元素出队顺序无要求,则可按照贪心思想,输入数据入队时保证所入队列队尾与输入数据之间的差值最小。如果给出的出队顺序合法,则按照贪心思想必有解(即每次入队都能满足条件顺利入队),反之,则无解。

AC代码如下

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m;
int s[60000];
int main()
{	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	int flag = 0;
	for(int i=0;i<n;i++)
	{
		int x;
		cin >> x;
		int cc = 0;
		while(x<s[cc]&&cc<m)
		{
			cc++;
		}
		if(cc==m)
			flag = 1;
		else
			s[cc] = x;//新数据入队时,前面的数据都没用了,直接替换即可
		sort(s,s+m,greater<int>());//从大到小排序,保证入队数据与队列中数据的数值差距最小
	}
	if(!flag)
		cout << "Karashi cblcd" << endl;
	else
		cout << "Karashi lovelove" << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值