今天上午进行的,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;
}
阅读(548) | 评论(0) | 转发(0) |