题意:有n个奶牛每天都会产奶,有人要吃掉每天产奶最少的奶牛,如果产奶量相同且最少,这个人就不吃任何一头牛,每头牛的产奶量是有周期的,输出还剩几头牛,第几天吃掉最后一头牛,如果没有牛被吃掉,第二个值输出0。
题解:模拟+暴力,先计算所有奶牛周期的最小公倍数,两两求出n个周期数的最小公倍数cnt,然后如果经过了cnt天还没有吃任何一头牛那就可以结束了。
#include <stdio.h>
#include <string.h>
const int N = 1005;
const int INF = 0x3f3f3f3f;
int cases, n, t[N][15], num[N], day, flag[N], cnt;
int count() {
int temp = num[1];
for (int i = 2; i <= n; i++) {
int temp1 = num[i];
int a = temp, b = temp1;
while (b != 0) {
int c = a % b;
a = b;
b = c;
}
temp = temp * temp1 / a;
}
return temp;
}
int main() {
scanf("%d", &cases);
while (cases--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
flag[i] = 1;
for (int i = 1; i <= n; i++) {
scanf("%d", &num[i]);
for (int j = 1; j <= num[i]; j++)
scanf("%d", &t[i][j]);
}
cnt = count();
int res = n, k = 0;
day = 0;
while (1) {
int minn = INF;
int temp = 0, index;
for (int i = 1; i <= n; i++) {
if (flag[i]) {
int aa = t[i][day % num[i] + 1];
if (aa < minn) {
minn = aa;
temp = 1;
index = i;
}
else if (aa == minn)
temp++;
}
}
if (temp == 1) {
flag[index] = 0;
res--;
k = 0;
}
else {
k++;
if (k == cnt) {
day = day - k;
break;
}
}
day++;
if (res == 0)
break;
}
if (res == n)
printf("%d 0\n", n);
else
printf("%d %d\n", res, day + 1);
}
return 0;
}