Google code jam 2008, Round 1A: B.Milkshakes 翻译

英文地址:here
本文仅作学习之用,题目的测试用例下载及答案的上传请到上面的英文地址,有不专业或者错误还请指正。

奶昔店

问题
你经营一家奶昔店,可以准备N种不同的口味,每一种口味又可以分成添加麦乳精(malted)和不添加麦乳精(unmalted)两种。因此,你一共可以做2N中不同口味的奶昔。
每一位顾客都有一些自己喜欢的奶昔,并且只要你能提供一种他们喜欢的口味就可以满足他们的要求。每位顾客喜欢的口味里面最多有一种是添加麦乳精的。
你要制作N桶奶昔,因此:

  • 每一种口味的奶昔都会有且只有一桶,而且它要么是添加麦乳精的要么是不添加的
  • 对每一位顾客,你都应该至少准备一桶他们喜欢的类型。
  • 含麦乳精的桶数尽可能的最少。

 找出有没有可能在这些约束条件下满足所有的顾客,如果满足,你需要制作那些口味的奶昔。

 如果可以满足所有的顾客,那么将会只有一个答案的添加麦乳精的奶昔桶数是最少的。

 输入

  •  包含一个整数C的一行,表示在输入文件里的测试用例数

 对于每一个测试用例,会有:

  • 包含一个整数N的一行,奶昔口味数
  • 包含一个整数M的一行,顾客数
  • M行,每一行对应一个顾客,包含:
    • 一个整数T >= 1,顾客喜欢的奶昔口味数,紧接着是:
    • T个整数对"X Y",一个是表示顾客喜欢的口味,X取值从1到N(包含),另一个Y为0表示不添加麦乳精,为1表示添加麦乳精。注意:
      • 对于每一位顾客没有一个整数对会出现1次以上
      • 每一位顾客至少有一种喜欢的口味(T >= 1)
      • 每一位顾客最多喜欢一种添加麦乳精的奶昔口味。(也就是说对于每一位顾客最多有一个整数对的Y = 1)

      所有的这些数字都用空格分开。

 输出

  •  C行,一行对应输入文件中出现的一个测试用例,每一行包含一个字符串"Case #X: ",X表示第几个测试用例,从1开始,紧跟着是:
    • 字符串"IMPOSSIBLE",表示如果用户的需求不能被满足 或者
    • N个用空格分开的整数,表示从1到N的每一种口味,如果是0表示对应的口味应该不添加麦乳精,如果是1表示应该添加麦乳精。

限制

小数据集和

C = 100

1 <= N <= 10
1 <= M <= 100

大数据集和

 C = 5
1 <= N <= 2000
1 <= M <= 2000

 在一个测试用例中所有顾客的全部T值的和不会超过3000

例子

 输入
2
5
3
1 1 1
2 1 0 2 0
1 5 0
1
2
1 1 0
1 1 1

 输出
Case #1: 1 0 0 0 0
Case #2: IMPOSSIBLE

在第一个例子中,你必须把#1口味添加美乳精来满足第一位顾客。其他的所有口味必须是不添加麦乳精的。把#2口味不添加麦乳精满足第二位顾客的需求,把#5口味做成不添加麦乳精满足第五位顾客的需求。
在第二个例子中只有一种口味。一个顾客希望是添加麦乳精的但另一位不希望,所以你不能同时满足他们两个。

原文地址:https://www.cnblogs.com/gg_shily/p/google_code_jam_1A_B.html