KTV

作者: Jacinth | 来源:发表于2017-08-18 21:14 被阅读0次

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

    相关文章

      网友评论

          本文标题:KTV

          本文链接:https://www.haomeiwen.com/subject/kbhzrxtx.html