KTV

2017-08-18  本文已影响0人  Jacinth

KTV
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
有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。
输出
对于每组测试数据,输出”YES”,表示离开时有人还有歌没唱完,否则输出”NO”。(不包括引号)。

样例输入
1
3 3 3
1 2
1 3
1 4
样例输出
YES

Hint
输入样例2:
2
1 1 1
2 1 2
2 2 1
1 1
1 1
输出样例2:
NO
YES

#include <bits/stdc++.h> 
using namespace std;
int main()
{
    int caseCnt;
    while (scanf("%d", &caseCnt) != EOF)
    {
        for (int j = 0; j < caseCnt; ++j)
        {
            unordered_map<int, int> songToSing;
            int personCnt, mCnt, songCnt;
            scanf("%d%d%d", &personCnt, &mCnt, &songCnt);
            for (int i = 0; i < personCnt; ++i)
            {
                int psCnt;
                scanf("%d", &psCnt);
                for (int j = 0; j < psCnt; ++j)
                {
                    int sId;
                    scanf("%d", &sId);
                    songToSing[sId - 1]++;
                }
            }
            for (auto kv : songToSing)
            {
                while (kv.second > 0 && songCnt > 0)
                {
                    int left = kv.second - min(personCnt, mCnt);
                    songToSing[kv.first] = left;
                    kv.second = left;
                    songCnt--;
                }
            }
            bool done = true;
            for (auto kv : songToSing)
            {
                if (kv.second > 0)
                {
                    done = false;
                    break;
                }
            }
            if (done)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读