uva 10050 Hartals
算法描述:开辟一个日期数组,清空为0,以1来标记当天已经有活动,不用再添加,每次从0变为1就计数一次。另外做一个预处理,将所有的周五和周六标记为1,但不能计数,没得到一个h,就调用函数在日期数组中搜索判断。判断所有h的倍数,如果为0,则计数并变为1
#include <stdio.h> #include <string.h> #define MAX 3660 bool date[MAX]; int count,N; void manage() { int i; memset( date , 0 , sizeof(date) ); for(i=7; i<=N+1; i+=7) date[i]=date[i-1]=1; //一定要N+1,不懂的话,想想N=12和N=13 } void find(int h) { int i; for(i=h; i<=N; i+=h) if(!date[i]) { count++; date[i]=1;} } int main() { int T,P,h,i; scanf("%d",&T); while(T--) { scanf("%d",&N); manage(); scanf("%d",&P); for(count=0,i=1; i<=P; i++) { scanf("%d",&h); find(h); } printf("%d\n",count); } return 0; }