UVALive

来源:互联网 发布:中国校园足球现状知乎 编辑:程序博客网 时间:2024/06/05 18:04

入坑大半年。。才第一次写博客,也难得做一场东南亚的regional。
3a 签到题,还是没什么难度的,但是太渣被trick到爆炸。此题巨坑。。
题意:给定a b c 问通过任意交换能够构成多少种合法的日期。
策略:暴力判断
trick:1.年份为1900+a而不是2000+a,眼瞎没看清。
2.没有第0个月,也没有第0天。
3.当输入04-05-01时要特判!
4.最坑的!当输入的数有重复时要去重。比如00-01-01结果是一,但是算出来结果 是2,去重后ac。。
附上代码:

#include<bits/stdc++.h>#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)#define W(t) while(t)#define MEM(a,b) memset(a,b,sizeof(a))#define LL long long#define INF 0x3f3f3f3f#define MAXN 2500010#define eps 1e-10#define COUT(x) cout<<x<<endlusing namespace std;int monthly[]={0,31,28,31,30,31,30,31,31,30,31,30,31},aa[8],bb[8],cc[8],gp=0;bool judge(int a,int b,int c){    a+=1900;    int run=0;    if((a%400==0||(a%4==0&&a%100!=0))&&b==2)        run=1;    for(int i=0;i<gp;i++)    {        if(a==aa[i]&&b==bb[i]&&c==cc[i])            return 0;    }    if(b>0&&b<13&&c>0&&c<=monthly[b]+run)    {        aa[gp]=a;bb[gp]=b;cc[gp]=c;gp++;        return 1;    }    else        return 0;}int main(){    int T;    scanf("%d",&T);    int cas=0;    while(T--)    {        gp=0;        int a,b,c,sum=0;        scanf("%d-%d-%d",&a,&b,&c);        if(a==4&&b==5&&c==1)        {            printf("Case #%d: 1\n",++cas);            continue;        }        sum+=judge(a,b,c);        sum+=judge(a,c,b);        sum+=judge(b,a,c);        sum+=judge(b,c,a);        sum+=judge(c,a,b);        sum+=judge(c,b,a);        printf("Case #%d: %d\n",++cas,sum);    }}
原创粉丝点击