[UVA][窮舉] 10273 - Eat or Not to Eat
Problem E
Eat or not to Eat?
Input: Standard Input
Output: Standard Output
A young farmer has N cows, but they produced really really a very very small amount of milk. John cannot live on the milk they made, so he's planning to eat some of the 'worst' cows to get rid of hunger. Each day, John chooses the cow that produces the LEAST amount of milk on that day and eat them. If there are more than one cow with minimal milk, John will be puzzled and will not eat any of them (Yeah! That's GREAT!!).
The i-th cow has a cycle of production Ti. That means, if it produces L unit milk on one day, it will also produce L unit after Ti days -- If it will not be eaten during these day :-). Though John is not a clever man, he doubts whether the cows will be eventually eaten up, so he asks for your help. Don't forget that he will offer you some nice beef for that!
Input
The first line of the input contains a single integer T, indicating the number of test cases. (1<=T<=50) Each test case begins with an integer N(1<=N<=1000), the number of cows. In the following N lines, each line contains an integer Ti(1<=Ti<=10), indicating the cycle of the i-th cow, then Ti integers Mj(0<=Mj<=250) follow, indicating the amount of milk it can produce on the j-th day.
Output
For each test case in the input, print a single line containing two integers C, D, indicating the number of cows that will NOT be eaten, and the number of days passed when the last cow is eaten. If no cow is eaten, the second number should be 0.
Sample Input
14
4 7 1 2 9
1 2
2 7 1
1 2
Sample Output
2 6__________________________________________________________________________________________
Rujia Liu
題目描述:
每頭牛的生產牛奶的數量按照週期性生產,每天會將生產最少的牛殺掉,如果有相同少的牛,則一頭也不殺。
問最後剩下幾頭牛,而最後一頭是第幾天殺的。
題目解法:
由於週期最多 10 天,最小公倍數為 2520 天。
每次窮舉 2520 天,查找每一天是否有牛可以殺,直到某個循環任何一頭牛都殺不成。
#include <stdio.h>
// For the values: 10, 9, 8, 7, 6, 5, 4, 3, 2
// The LCM is: 2520
int main() {
int testcase;
int n, i, j, k;
int T[1005][15], Tn[1005];
scanf("%d", &testcase);
while(testcase--) {
scanf("%d", &n);
for(i = 0; i < n; i++) {
scanf("%d", &Tn[i]);
for(j = 0; j < Tn[i]; j++)
scanf("%d", &T[i][j]);
}
int killed[1005] = {};
int LCM = 2520, days = 0, lastDay = 0;
int hasKilled = 1, sum;
while(hasKilled) {
hasKilled = 0;
for(i = 0; i < LCM; i++) {
days++;
int mn = 0xfffffff, mncnt = 0, mnidx;
for(j = 0; j < n; j++) {
if(killed[j]) continue;
int v = T[j][i%Tn[j]];
if(v < mn)
mn = v, mncnt = 0, mnidx = j;
if(v == mn)
mncnt++;
}
if(mncnt == 1) {
killed[mnidx] = 1;
lastDay = days;
hasKilled = 1;
}
}
}
for(i = 0, sum = 0; i < n; i++)
sum += killed[i] == 0;
printf("%d %d\n", sum, lastDay);
}
return 0;
}