题目来自于:https://www.acmcoder.com/#/practice/code
题目描述:有n个人去KTV唱歌,每个人都有自己想唱的一些歌曲。已知该KTV每个房间都只有x个麦克风,同一首歌可以同时多人一起唱,但是同时唱的人不能超过x人,同一时刻只能唱一首歌。一共只有y首歌的时间,所有人想唱的歌都唱完或者y首歌唱完了他们就会离开。他们想知道在最优的安排策略下(让每个人尽量唱完自己想唱的歌),当他们离开时是否还有人有想唱的歌没有唱。输入保证每个人想唱的歌都不同。
输入描述
第一行一个整数T,表示测试的数据组数1≤T≤10;
对于每组测试数据,第一行三个整数n,x,y,含义见题面,1≤n≤100,1≤x≤100,1≤y≤1000;
接下来n行按行从上到下顺序分别给出了第1到第n个人想唱的歌曲,其中每行开头一个整数a[i]表示第i个人想唱歌的数量,后面a[i]个整数,表示歌曲编号,1≤a[i]≤10。KTV可选歌曲总数不超过1000,即编号不大于1000。
输出描述
对于每组测试数据,输出” NO”,表示离开时有人还有歌没唱完,否则输出” YES”。(不包括引号)。
样例输入
[1,[3,3,3],[1,2],[1,3],[1,4]] [组数,[组1人数,话筒数,歌曲数],[组1人1想唱歌数,歌1编号],[组1人2想唱歌数,歌1编号],[组1人3想唱歌数,歌1编号] ]
样例输出
YES
提示
输入样例2:[2,[1,1,1],[2,1,2],[2,2,1],[1,1],[1,1]] //[组数,[组1人数,话筒数,歌曲数],[组2人数,话筒数,歌曲数],[组1人1想唱歌数,歌1编号,歌2编号],[组2人1想唱歌数,歌1编号],[组2人2想唱歌数,歌1编号] ] 输出样例2: NO YES
示例2注释 [2,[1,1,1],[2,1,2],[2,2,1],[1,1],[1,1]]
1、分组处理数据,处理为
[2,1,2,[[1],[1]] ]
,即[n,x,y,[[人1的歌1,人1的歌2],[人2的歌1]。。。]]
2、计算想唱的歌的首数,若想唱的首数 小于 能唱的首数y 直接返回yes
3、否则计算需要几首歌的时间,首先将想唱的歌编号放在一起进行排序,相同的歌曲放在同一个字数组内,例如:
[[1,1],[2],[3,3,3],[4,4]]
4、根据x(麦克风数)计算同一首歌需要唱的次数,相加在一起,与y相比较,大于y则为no,小于则为yes
var printOut = function(item){
let [n,x,y,song] = item;
//计算一次一首的情况 总的想唱歌曲数---------------
let countnum = 0;
song.forEach(item1=>{
countnum += item1.length;
})
if(countnum<y){
//想唱歌曲数 小于y 则直接返回yes------------
item.push('YES')
}else{
//想唱的歌曲放在一起----------------
let songarr = [];
song.forEach(item2=>{
songarr.push(...item2);
})
songarr.sort((x,y)=>x-y);
//songarr:[2,1]
//相同的歌曲放在一个数组内-------------
let samesong = [];
while(songarr.length){
let firstsong = songarr[0]
let songindex = songarr.findIndex((m,n)=>{
if(m!==firstsong){
return n
}
})
songindex>0
?samesong.push(songarr.splice(0,songindex))
:samesong.push(songarr.splice(0,songarr.length))
}
//samesong:[[1],[2]]
//计算需要几首歌的时间-------------------
let ycount = 0;
samesong.forEach(sameson=>{
//有x个麦克风,所以同一首歌需要唱的次数为Math.ceil(sameson.length/x)
ycount += Math.ceil(sameson.length/x)
})
//console.log(ycount);//需要几首歌的时间
//比较需要的唱歌首数 和 仅有的唱歌首数---------------
if(ycount>y){
item.push('NO')
}else{
item.push('YES')
}
}
//打印数据的结果
console.log(item[item.length-1])
}
var dealarr = function(arr){
let [count,...temparr] = arr;
//count:2 //temparr:[[1,1,1],[2,1,2],[2,2,1],[1,1],[1,1]]
let group = temparr.splice(0,count);
//group:[[1,1,1],[2,1,2]] // temparr:[[2,2,1],[1,1],[1,1]]
group.forEach(item=>{
item.push(temparr.splice(0,item[0]))
})
//group:[ [1,1,1,[[2,2,1]] ],[2,1,2,[[1,1],[1,1]]] ]
group.forEach(item=>{
item[3].forEach(itemson=>{
itemson = itemson.shift()
})
})
//group:[ [1,1,1,[[2,1]] ], [2,1,2,[[1],[1]] ] ]
group.forEach(item=>{
printOut(item)
})
}
dealarr([2,[1,1,1],[2,1,2],[2,2,1],[1,1],[1,1]])
结果:
NO
YES