日期类
第四届
第一题:
题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。
方法一 excel
在excel中,只能计算1900年1月1日到9999年12月30日两个日期的差
方法二:电脑自带的计算器
方法三:
代码计算:
#include<stdio.h>
int days1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y=1777,m,d;
int sum=8113;
if(y%4==0&y%100!=0||y%400==0)
{
for(int i=5;i<=12;i++)
sum-=days2[i];
}
else
{
for(int i=5;i<=12;i++)
sum-=days1[i];
}
y=1778;
while(sum>365)
{
y++;
if(y%4==0&y%100!=0||y%400==0)
sum-=366;
else
sum-=365;
}
m=1;
if(y%4==0&y%100!=0||y%400==0)
{
while(sum>31)
{
sum-=days2[m];
m++;
}
}
else
{
while(sum>31)
{
sum-=days1[m];
m++;
}
}
printf("%d-",y);
if(m<10)
printf("0%d-",m);
else
printf("%d-",m);
if(sum<10)
printf("0%d-\n",sum);
else
printf("%d\n",sum);
return 0;
}
第六届
2、星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
方法一二同上
方法三 代码实现
#include<stdio.h>
int days1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y,m;
int shengyu=1000-(30-9)-31;
y=2015;
while(shengyu>365)
{
if(y%4==0&y%100!=0||y%400==0)
shengyu-=366;
else
shengyu-=365;
y++;
}
if(y%4==0&y%100!=0||y%400==0)
{
m=1;
while(shengyu>29)
{
shengyu-=days2[m];
m++;
}
printf("%d-%d-%d\n",y,m,shengyu);
}
else
{
m=1;
while(shengyu>28)
{
shengyu-=days1[m];
m++;
}
}
printf("%d-",y);
if(m<10)
printf("0%d-",m);
else
printf("%d-",m);
if(shengyu<10)
printf("0%d-\n",shengyu);
else
printf("%d\n",shengyu);
return 0;
}
我 是 分 割 线
暴力
第三届
第二题
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
答案写在“解答.txt”中,不要写在这里!
代码如下 :
#include<stdio.h>
int main()
{
int a,b,c,d,e,f;
for(a=1; a<10; a++)
{
for(b=0; b<10; b++)
{
if(b==a)
continue;
for(c=0; c<10; c++)
{
if(c==a||c==b)
continue;
for(d=0; d<10; d++)
{
if(d==a||d==b||d==c)
continue;
for(e=1; e<10; e++)
{
if(e==a||e==b||e==c||e==d)
continue;
for(f=0; f<10; f++)
{
if(f==a||f==b||f==c||f==d||f==e)
continue;
if((a*10000+b*1000+c*100+d*10+e)*f==(e*10000+d*1000+c*100+b*10+a))
printf("%d %d %d %d %d\n",a,b,c,d,e);
}
}
}
}
}
}
return 0;
}
第四届
第二题:
标题: 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
代码如下:
#include<stdio.h>
int main()
{
int a,b,c,d,e,ans=0;
for(a=1; a<=9; a++)
{
for(b=1; b<=9; b++)
{
if(b==a)
continue;
for(c=1; c<=9; c++)
{
if(c==a||c==b)
continue;
for(d=1; d<=9; d++)
{
if(d==a||d==b||d==c)
continue;
for(e=1; e<=9; e++)
{
if(e==a||e==b||e==c||e==d)
continue;
if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
ans++;
}
}
}
}
}
printf("%d\n",ans);
return 0;
}
第五届
6.标题:奇怪的分式
上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
1/4 乘以 8/5
小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
请写出所有不同算式的个数(包括题中举例的)。
显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!
注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。
和以上两题题型类似 ,但是题目中不计分子分母相同的情况
代码如下:
#include<stdio.h>
int main()
{
double x,y,z,k;
int ans=0;
for(x=1.0; x<=9.0; x++)
for(y=1.0; y<=9.0; y++)
for(z=1.0; z<=9.0; z++)
for(k=1.0; k<=9.0; k++)
{
if(x==y&&z==k)
continue;
if((x*z)/(y*k)==(10*x+z)/(10*y+k))
ans++;
}
printf("%d\n",ans);
return 0;
}
第六届
3、三羊献瑞
观察下面的加法算式:
祥 瑞生辉
+ 三羊献瑞
-------------------
三 羊生瑞气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
#include<stdio.h>
int main()
{
int a,s,d,f,g,h,j,k;
for(a=1; a<=9; a++)
for(s=0; s<=9; s++)
for(d=0; d<=9; d++)
for(f=1; f<=9; f++)
for(g=0; g<=9; g++)
for(h=0; h<=9; h++)
for(j=0; j<=9; j++)
for(k=0; k<=9; k++)
if((1000*g+100*f+10*h+j+1000*a+100*s+10*d+f==10000*a+1000*s+100*h+10*f+k)&&(a!=s)&&(a!=d)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=j)&&(a!=k)&&(s!=d)&&(s!=f)&&(s!=g)&&(s!=h)&&(s!=j)&&(s!=k)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=j)&&(d!=k)&&(f!=g)&&(f!=h)&&(f!=j)&&(f!=k)&&(g!=h)&&(g!=j)&&(g!=k)&&(h!=j)&&(h!=k)&&(j!=k)&&(h!=j)&&(h!=k)&&(j!=k))
printf("%d %d %d %d\n",a,s,d,f);
return 0;
}
C++库中有一个全排列函数next_permutation()
#include <cstdio> //如此用法,输入输出快
#include <algorithm>
using namespace std;
int main() {
int a[10];
for (int i = 0; i < 10; i++) a[i] = i;
do {
if (!a[2] || !a[6]) continue;
int x =a[2]*1000 + a[3]*100 + a[4]*10 + a[5];
int y =a[6]*1000 + a[7]*100 + a[8]*10 + a[3];
int z = a[6]*10000 + a[7]*1000 + a[4]*100 + a[3]*10 + a[9];
if (x + y == z) printf("%d + %d = %d\n", x, y, z);
} while (next_permutation(a, a+10));
return 0;
}
第七届
3. 凑算式
B DEF
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
代码如下:
#include<stdio.h>
int main(){
int A,B,C,D,E,F,G,H,I;
int sum1,sum2,sum3,sum4;
int ans;
ans=0;
for(A=1;A<=9;++A){
for(B=1;B<=9;++B){
if(B==A)continue;
for(C=1;C<=9;++C){
if(C==A||C==B)continue;
for(D=1;D<=9;++D){
if(D==A||D==B||D==C)continue;
for(E=1;E<=9;++E){
if(E==A||E==B||E==C||E==D)continue;
for(F=1;F<=9;++F){
if(F==A||F==B||F==C||F==D||F==E)continue;
for(G=1;G<=9;++G){
if(G==A||G==B||G==C||G==D||G==E||G==F)continue;
for(H=1;H<=9;++H){
if(H==A||H==B||H==C||H==D||H==E||H==F||H==G)continue;
for(I=1;I<=9;++I){
if(I==A||I==B||I==C||I==D||I==E||I==F||I==G||I==H)continue;
sum1=A*C*(G*100+H*10+I);
sum2=B*(G*100+H*10+I);
sum3=(D*100+E*10+F)*C;
sum4=10*C*(G*100+H*10+I);
if(sum1+sum2+sum3==sum4){
++ans;
}
}
}
}
}
}
}
}
}
}
printf("%d\n",ans);
return 0;
}
当然也可以使用全排列函数
我 是 分 割 线
第四届
第八题
题目标题:翻硬币
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
程序输出:
一个整数,表示最小操作步数
例如:
用户输入:
**********
o****o****
程序应该输出:
5
再例如:
用户输入:*o**o***o***
*o***o**o***
程序应该输出:
1
资源约定:
峰值内存消耗 < 64MCPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a[1000+5],b[1000+5];
int ans=0,pos[1000+5],p=0;
scanf("%s%s",a,b);
int l=strlen(a);
for(int i=0; i<l; i++)
if(a[i]!=b[i])
pos[p++]=i;
for(int i=1; i<p; i++,i++)
ans+=pos[i]-pos[i-1];
printf("%d\n",ans);
return 0;
}
第七届
9. 交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:
2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
例如,输入:
5
3 1 2 5 4
程序应该输出:
3
再例如,输入:
55 4 3 2 1
程序应该输出:
2
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
代码如下:
#include <cstdio>
int pos[10010];
inline void swap(int a,int b)
{
int t = pos[a];
pos[a] = pos[b];
pos[b] = t;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
scanf("%d",pos+i);
int ans = 0;
for(int i=1;i<=n;i++)
{
while(pos[i] != i)
{
swap(i,pos[i]);
ans ++ ;
}
}
printf("%d\n",ans);
return 0;
}
我 是 分 割 线
第七届
7. 剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
第八届
第四题
标题:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字
DFS 就不多做解释了 用DFS可以解决不少题。