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

1
4
4 7 1 2 9
1 2
2 7 1
1 2

Sample Output

2 6

题意:n头牛,每头有产奶周期,现在要杀牛,如果当天能找到产奶最小的牛且只数为1,就可杀,问最后剩几头牛和最后杀牛的天数。

思路:暴力,枚举每一天,周期为所有周期的最小公倍数,如果两次吃牛间隔超过一个周期,说明以后就肯定不会在杀牛了。

代码:

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
const int N = 1005, M = 15, MAXT = 2520;

int T, n, t[N], pro[N][M], day, vis[N];

void init() {
    memset(vis, 0, sizeof(vis));
    scanf("%d", &n);
    for (int i = 0; i < n; i ++) {
	scanf("%d", &t[i]);
	for (int j = 0; j < t[i]; j ++)
	    scanf("%d", &pro[i][j]);
    }
}

void solve() {
    init();
    int sum = 0, dayv = -1;
    for (day = 0; day - dayv <= MAXT; day ++) {
	int Min = INF, count = 0, index = 0;
	for (int i = 0; i < n; i++) {
	    if (vis[i]) continue;
	    if (Min > pro[i][day % t[i]]) {
		Min = pro[i][day % t[i]];
		count = 1;
		index = i;
	    }
	    else if (Min == pro[i][day % t[i]]) {
		count ++;
	    }
	}
	if (count == 1) {
	    vis[index] = 1;
	    sum ++;
	    dayv = day;
	}
    }
    printf("%d %d\n", n - sum, dayv + 1);
}

int main() {
    scanf("%d", &T);
    while (T --) {
	solve();
    }
    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值