链接: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;
}