ZOJ3944 People Counting
ZOJ3939 The Lucky Week
1.PeopleConting
题意:照片上有很多个人,用矩阵里的字符表示。一个人如下:
.O. /|\ (.)
占3*3格子,句号“.”为背景。没有两个人完全重合。有的人被挡住了一部分。问照片上有几个人。
题解:
先弄个常量把3*3人形存起来,然后6个部位依次找,比如现在找头,找到一个头,就把这个人删掉(找这个人的各个部位,如果在该部位位置的不是这个人的身体,就不删),删成句号,疯狂找就行了。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 const int MAXN=111; 6 const char man[3][3] = { {'.','O','.'}, 7 {'/','|','\\'}, 8 {'(','.',')'}}; 9 const int X[6] = {0,1,1,1,2,2}; 10 const int Y[6] = {1,0,1,2,0,2}; 11 char a[MAXN][MAXN]; 12 13 int n,m; 14 15 void delMan(int x,int y,int k){ 16 int mx,my; 17 mx = x - X[k]; 18 my = y - Y[k]; 19 int i; 20 for(i=0; i<6; i++){ 21 if(a[mx+X[i]][my+Y[i]]==man[X[i]][Y[i]]){ 22 a[mx+X[i]][my+Y[i]] = '.'; 23 } 24 } 25 } 26 27 int farm(){ 28 int i,j,k; 29 int sum=0; 30 for(k=0; k<6; k++){ 31 char now = man[X[k]][Y[k]]; 32 for(i=0; i<n; i++){ 33 for(j=0; j<m; j++){ 34 if(a[i][j]==now){ 35 sum++; 36 delMan(i,j,k); 37 } 38 } 39 } 40 } 41 return sum; 42 } 43 44 int main() { 45 int T,i,j; 46 scanf("%d",&T); 47 while(T--) { 48 scanf("%d%d",&n,&m); 49 for(i=0; i<n; i++) 50 for(j=0; j<m; j++) { 51 scanf(" %c",&a[i][j]); 52 } 53 printf("%d\n",farm()); 54 } 55 }
2.The Lucky Week
题意:一个月的1号或者11号或者21号是星期一的话,这个星期就是Lucky Week。求从起始日期开始的第n个LuckyWeek是几号开始的。(起始日期当作第一个LuckyWeek)。
题解:日期太大,不能暴力,要找规律。打表观察,发现400年是一个周期,也就是如果今年4月11号是LuckyWeek,400年后,4月11号又是LuckyWeek。
这样如果跨越了若干的400年,就只用算一次400年,其他的直接算出来。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 const int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; 6 7 int Y,M,D,n; 8 9 inline bool isRun(const int &year) { 10 return (year%4==0 && year%100!=0) || (year%400==0); 11 } 12 13 int getDays(int year,int month) { 14 if(month!=2)return md[month-1]; 15 if(isRun(year))return 29; 16 else return 28; 17 } 18 19 void beNextMonth(int &y,int &m,int &d,int &we) { 20 int days = getDays(y,m); 21 int cha = days + 1 - d; 22 m++; 23 if(m>12) { 24 y++; 25 m=1; 26 } 27 d=1; 28 we = (we+cha)%7; 29 } 30 31 int daBiao() { 32 int y=2016, m=4, d=11; 33 int we=0; 34 int edy=2417,edm=1; 35 int sum=0; 36 while(!(y==edy && m==edm)) { 37 for(int i=0; i<=20; i+=10) 38 if((we+i)%7==0) { 39 if(y>=2017)sum++; 40 // if(y==2016 || y==2416)printf("%d-%d-%d\n",y,m,d+i); 41 } 42 beNextMonth(y,m,d,we); 43 } 44 printf("%d!/n",sum); 45 } 46 47 void farm(int &yy,int &mm,int &dd) { 48 int edy=Y+400; 49 int edm=M; 50 int sum=0; 51 int y=Y,m=M,d=D,we=0; 52 while(true) { 53 for(int i=0; i<=20; i+=10) 54 if((we+i)%7==0) { 55 sum++; 56 if(sum==n) { 57 yy=y; 58 mm=m; 59 dd=d+i; 60 return; 61 } 62 } 63 beNextMonth(y,m,d,we); 64 if(y==edy && m==edm)break; 65 } 66 n-=sum; 67 if(n>sum) { 68 int t = n/sum; 69 n-=t*sum; 70 y+=t*400; 71 } 72 sum=0; 73 while(true) { 74 for(int i=0; i<=20; i+=10) 75 if((we+i)%7==0) { 76 sum++; 77 if(sum==n) { 78 yy=y; 79 mm=m; 80 dd=d+i; 81 return; 82 } 83 } 84 beNextMonth(y,m,d,we); 85 if(y==edy && m==edm)break; 86 } 87 } 88 89 int main() { 90 int T,i,j; 91 // daBiao(); 92 // return 0; 93 scanf("%d",&T); 94 while(T--) { 95 scanf("%d%d%d%d",&Y,&M,&D,&n); 96 int y,m,d; 97 farm(y,m,d); 98 printf("%d %d %d\n",y,m,d); 99 } 100 }