24h購物| | PChome| 登入
2014-02-17 09:11:25| 人氣2,525| 回應0 | 上一篇 | 下一篇

[UVA][窮舉] 10273 - Eat or Not to Eat

推薦 0 收藏 0 轉貼0 訂閱站台

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

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

台長: Morris
人氣(2,525) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 教育學習(進修、留學、學術研究、教育概況) | 個人分類: UVA |
此分類下一篇:[UVA][線段樹] 10587 - Mayor's posters
此分類上一篇:[UVA][排列組合] 10232 - Bit-wise Sequence

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文