五六兩天不算。
先把罷工參數做sort,
若出現倍數情況,就不儲存該參數。
(例如已有2,又出現4,4 % 2 = 0,
4就不列入)
接著再做天數紀錄,
最後計算天數即可。
/* ACM 10050 Hartals * mythnc * 2011/11/06 22:57:42 * run time: 0.020 */ #include <stdio.h> #define MAXDAY 3650 #define MAXPTY 100 #define TRUE 1 #define FALSE 0 int hartal(int *, int); void sort(int *, int, int); int loseday(int *, int, int *, int); int countday(int *, int); int main(void) { int day[MAXDAY] = { FALSE }; int party[MAXPTY]; int set, nd, np; scanf("%d", &set); while (set--) { scanf("%d", &nd); scanf("%d", &np); np = hartal(party, np); printf("%d\n", loseday(day, nd, party, np)); } return 0; } /* hartal: check hartal number can be mod by * other number or not only receive hartal * number when it can't be mod by other numbers */ int hartal(int *p, int n) { int count, i, j, tmp, rec; for (count = i = 0; i < n; i++) { scanf("%d", &tmp); for (rec = TRUE, j = 0; j < count; j++) if (tmp % p[j] == 0) { rec = FALSE; break; } if (rec) { sort(p, tmp, ++count); } } return count; } /* sort: insertion sort hartal number */ void sort(int *p, int number, int n) { int i; if (n == 1) { p[0] = number; return; } for (i = n - 2; i > -1; i--) if (p[i] > number) { p[i + 1] = p[i]; if (i == 0) p[0] = number; } else { p[i + 1] = number; break; } } /* loseday: find the lose day */ int loseday(int *d, int nd, int *p, int np) { int i, j; for (i = 0; i < np; i++) for (j = p[i]; j < nd + 1; j += p[i]) if (j % 7 != 0 && j % 7 != 6 && !d[j]) d[j] = TRUE; return countday(d, nd); } /* countday: initalize value to zero and * return sum of hartal days */ int countday(int *d, int nd) { int i, sum; for (sum = 0, i = 1; i < nd + 1; i++) if (d[i]) { d[i] = FALSE; /* initialize value to 0 */ sum++; } return sum; }
沒有留言:
張貼留言