ZOJ3944 People Counting ZOJ3939 The Lucky Week (模拟)

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 }
View Code

 

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 }
View Code

 

转载于:https://www.cnblogs.com/yuiffy/p/5485086.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值