题目大意:在一个农场里面有N头奶牛,每头牛都有一个产奶周期,在一个周期内,每头奶牛有对应的产奶值,要求找出每一天中产奶最少的那头牛,并将其杀了,如果有两头以上产奶最少的牛,就不能杀,问杀了几头牛和杀死最后一头牛是在第几天
解题思路:暴力
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 1010
#define INF 0x3f3f3f3f
int t[maxn],c[maxn][maxn],vis[maxn];
int N,T;
int gcd(int a,int b) {
return b == 0 ? a:gcd(b,a%b);
}
void init() {
scanf("%d",&N);
memset(vis,0,sizeof(vis));
for(int i = 1; i <= N; i++) {
scanf("%d",&t[i]);
for(int j = 0; j < t[i]; j++)
scanf("%d",&c[i][j]);
}
int temp;
T = 1;
for(int i = 1; i <= N; i++) {
if(T < t[i])
temp = gcd(t[i],T);
else
temp = gcd(T,t[i]);
T = T * t[i] / temp;
}
}
void solve() {
int flag,MIN,mark,pos,num = 0,day = 0;
for(int p = 0; ; p++) {
flag = 0;
for(int cur = 0; cur <= T - 1; cur++) {
MIN = INF;
for(int j = 1; j <= N; j++) {
if(!vis[j] && c[j][cur % t[j]] < MIN) {
mark = 1;
pos = j;
MIN = c[j][cur % t[j]];
}
else if(!vis[j] && c[j][cur % t[j]] == MIN)
mark = 2;
}
if(mark == 1) {
flag = 1;
vis[pos] = 1;
num++;
day = p * T + cur + 1;
}
}
if(!flag)
break;
}
printf("%d %d\n",N - num,day);
}
int main() {
int test;
scanf("%d",&test);
while(test--) {
init();
solve();
}
return 0;
}