Chinaunix首页 | 论坛 | 博客
  • 博客访问: 591226
  • 博文数量: 197
  • 博客积分: 7001
  • 博客等级: 大校
  • 技术积分: 2155
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-24 00:29
文章分类

全部博文(197)

文章存档

2022年(1)

2019年(2)

2015年(1)

2012年(100)

2011年(69)

2010年(14)

2007年(3)

2005年(7)

分类: C/C++

2011-12-03 22:26:32

今天上午进行的,10个题最好的学生做了5个,差强人意。
对称日和循环移动是两个原创题,结果学生都没人出。

对称日:
对称日

Description

世 界完全对称日是指公历纪年日期中数字左右完全对称的日期,如2010年1月2日(20100102),2011年11月2日(20111102)等都是对 称日。很明显我们用八位整数表示日期,如果日月数不足10则加一个前导0。给定两个合法日期, 求两个日期之间(包含它们自身)有多少对称日。

Input

有多行数据.每一行数据包含两个日期A和B, A其中18000101

Output

输出A和B之间的对称日数目.每一行输出对应每一行输入

Sample Input

20100102 20100103

Sample Output

1

思路,先生成所有的对称日,再处理即可。生成对称日充分利用日期条件,首先18**,19**,40**是不可能,所以只可能是2/3***年,其次,月份必须小于12,再次,因为日子的尾部是2或3的话,前面只可能是0,1,2

#include
#include
using namespace std;

int date[500];

int main(void)
{   
    //freopen("in.dat", "r", stdin);
    //freopen("5.out", "w", stdout);
    int A, B;

    int cnt = 0;
    int i, j, k;
    for(i = 2; i <= 3; i++)//2***年或3***年
        for(j = 0; j < 3; j++) //只有[0-2][2-3]才是符合约约束合法日期
            for(k = 1; k <= 12; k++)//k表示月份
                date[cnt++] = i * 10000001 + j * 1000010 + k * 100 + k / 10 * 10000 + (k % 10) * 100000;
    sort(date, date + cnt);
    while(scanf("%d%d", &A, &B) != EOF){
        int num = 0;
        for(i = 0; i < cnt; i++)
            if(date[i] >= A && date[i] <= B)
                num++;
        printf("%d\n", num);
    }

    return 0;
}

处理特殊情况ACM即可,嵌套用递归处理
#include
#include

void filter(char s[])
{
    int i, len = strlen(s);

    int start = 0;
    for(i = 0; i < len; i++){
        if(i +2 < len && s[i] == 'A'&& s[i + 1] == 'C' && s[i + 2] == 'M')
           i += 2;
        else
            s[start++] = s[i];

    }
    s[start] = '\0';
    if(start != len)
        filter(s);
    
}

int main(void)
{
    char s[2000];

    while(scanf("%s", s) != EOF){
        filter(s);
        puts(s);
    }

    return 0;
}

阅读(506) | 评论(0) | 转发(0) |
0

上一篇:幂函数的奇偶性

下一篇:Xen Source Code Layout

给主人留下些什么吧!~~