uva 10273(暴力)

来源:互联网 发布:网络教研总结 编辑:程序博客网 时间:2024/05/16 09:23

题意:有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);elseprintf("%d %d\n", res, day + 1);}return 0;}


0 0