0%

3-17

[蓝桥杯2017初赛]日期问题

题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在1960年1月1日至2059年12月31日。
令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入
一个日期,格式是”AA/BB/CC”。 (0 <= A, B, C <= 9)

输出
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。
多个日期按从早到晚排列。

样例输入
02/03/04

样例输出
2002-03-04
2004-02-03
2004-03-02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e6+5;

int yy,mm,dd;

int day2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};


int ans[2200][15][35];


bool fun(int year){
bool flag=0;
if(year%400==0||(year%4==0&&year%100!=0)){
flag=1;
}
return flag;
}


int main (){
scanf("%d/%d/%d",&yy,&mm,&dd);
//年/月/日
if(yy>=0&&yy<=59&&mm>=1&&mm<=12&&dd>=1&&dd<=31){
ans[yy+2000][mm][dd]=1;
if(fun(yy+2000)){
if(dd>day2[mm]){
ans[yy+2000][mm][dd]=0;
}
}
else{
if(dd>day[mm]){
ans[yy+2000][mm][dd]=0;
}
}


}
if(yy<=99&&yy>=60&&mm>=1&&mm<=12&&dd>=1&&dd<=31){

ans[yy+1900][mm][dd]=1;
if(fun(yy+1900)){
if(dd>day2[mm]){
ans[yy+1900][mm][dd]=0;
}
}
else{
if(dd>day[mm]){
ans[yy+1900][mm][dd]=0;
}
}


}

//月/日/年

if(yy>=1&&yy<=12&&mm>=1&&mm<=31&&dd>=60){

ans[dd+1900][yy][mm]=1;

if(fun(dd+1900)){
if(mm>day2[yy]){
ans[dd+1900][yy][mm]=0;
}
}
else{
if(mm>day[yy]){
ans[dd+1900][yy][mm]=0;
}
}

}
if(yy>=1&&mm>=1&&yy<=12&&mm<=31&&dd<=59){
ans[dd+2000][yy][mm]=1;
if(fun(dd+2000)){
if(mm>day2[yy]){
ans[dd+2000][yy][mm]=0;
}
}
else{
if(mm>day[yy]){
ans[dd+2000][yy][mm]=0;
}
}

}

//日/月/年

if(yy>=1&&yy<=31&&mm>=1&&mm<=12&&dd>=60){

ans[dd+1900][mm][yy]=1;
if(fun(dd+1900)){
if(yy>day2[mm]){
ans[dd+1900][mm][yy]=0;
}
}
else{
if(yy>day[mm]){
ans[dd+1900][mm][yy]=0;
}
}

}
if(yy>=1&&yy<=31&&mm>=1&&mm<=12&&dd<=59){

ans[dd+2000][mm][yy]=1;
if(fun(dd+2000)){
if(yy>day2[mm]){
ans[dd+2000][mm][yy]=0;
}
}
else{
if(yy>day[mm]){
ans[dd+2000][mm][yy]=0;
}
}

}
for(int i=1960;i<=2059;i++){
for(int j=1;j<=12;j++){
for(int k=1;k<=31;k++){
if(ans[i][j][k]==1){
printf("%d-%02d-%02d\n",i,j,k);
}
}
}
}
}

[蓝桥杯2017初赛]九宫幻方

题目描述
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。
三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:
“二四为肩,六八为足,左三右七,戴九履一,五居其中”,
通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。
现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~

输入
输入一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。

输出
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。

样例输入
0 7 2
0 5 0
0 3 0

样例输出
6 7 2
1 5 9
8 3 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e6+5;

int a[10]={0,1,2,3,4,5,6,7,8,9};
int b[10];
int c[10];
int ans;
int main (){
for(int i=1;i<=9;i++){
scanf("%d",&b[i]);
}

do{
int row1,row2,row3;
int col1,col2,col3;
int k1,k2;
row1=a[1]+a[2]+a[3]; row2=a[4]+a[5]+a[6]; row3=a[7]+a[8]+a[9];
col1=a[1]+a[4]+a[7]; col2=a[2]+a[5]+a[8]; col3=a[3]+a[6]+a[9];
k1=a[1]+a[5]+a[9]; k2=a[3]+a[5]+a[7];
if(row1==15&&row2==15&&row3==15&&col1==15&&col2==15&&col3==15&&k1==15&&k2==15){
bool flag=1;
for(int i=1;i<=9;i++){
if(b[i]!=0&&b[i]!=a[i]){
flag=0;
break;
}
}
if(flag){
ans++;
for(int i=1;i<=9;i++){
c[i]=a[i];
}
}
}

}while(next_permutation(a+1,a+10));
if(ans==1){
for(int i=1;i<=9;i++){
printf("%d ",c[i]);
if(i%3==0) printf("\n");
}
}
else{
printf("Too Many\n");
}
}

[蓝桥杯2017初赛]等差素数列

题目描述
2,3,5,7,11,13,….是素数序列。
类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?

输出
输出一个整数表示答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e6+5;

int n=1000000;

int vis[MAX_N];
int prime[MAX_N];
int cnt=0;
void Prime()
{

for(int i=2;i<=n;i++)
{
if(!vis[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=i;
if(i%prime[j]==0) break;
}
}
}


int main (){
cout<<210<<endl;
/*Prime();
int res=1;
for(int i=0;i<1000&&res<10;i++){
int temp=prime[i];
for(int j=1;j<=1000&&res<10;j++){
res=1;
int tmp=temp+j;
while(!vis[tmp]){
res++;
tmp=tmp+j;
//cout<<tmp<<" "<<j<<endl;
if(res>=10){
printf("%d %d",temp,j);
break;
}
}
}
}
*/
return 0;
}

[蓝桥杯2018初赛]乘积尾零

题目描述
如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

1
2
3
4
5
6
7
8
9
10
5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211

输出
输出一个整数表示答案

思路:0会由2和5共同构成,将每个数拆分成由2 和 5 组成的数,统计2 和5 的个数,然后取2 和 5 个数的最小值即为尾零的个数,实际上5的个数会比2的个数小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX_N=1e6+5;

int a;

int main (){
/*int two=0,five=0;
for(int i=1;i<=100;i++){
scanf("%d",&a);
while(a%2==0||a%5==0){
if(a%2==0) two++,a/=2;
if(a%5==0) five++,a/=5;
}
}
int ans=min(two,five);
cout<<ans<<endl;*/
cout<<31<<endl;
return 0;
}
-------------本文结束感谢您的阅读-------------