1502131514-蓝桥杯-算法提高 日期计算

算法提高 日期计算

时间限制:1.0s   内存限制:256.0MB

问题描述

  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。

输入格式

  输入只有一行

  YYYY MM DD

输出格式

  输出只有一行

  W

数据规模和约定

  1599 <= YYYY <= 2999

  1 <= MM <= 12

  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期

  1 <= W <= 7,分别代表周一到周日

样例输入

2011 11 11

样例输出

5

解题思路

计算出给定日期与2011.11.11的差值,然后对7取余,与周五相比较运算,给出答案。

注意2011.11.11前和后的日期计算星期的时候不一样。

计算日期差值的时候,可以先计算年之间的差值,然后在计算两边月份的差值,最后再弄日的。

代码

#include<stdio.h>
int leap(int a)
{
	if(a%400==0||(a%4==0&&a%100!=0))
	    return 366;
	else
	    return 365;
}
int day(int a,int b)
{
	if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
	    return 31;
	else if(b==4||b==6||b==9||b==11)
	    return 30;
	else
	{
		if(leap(a)==366)
		    return 29;
		else
		    return 28;
	}
}
int nian(int a)
{
	int i;
	int sum=0;
	if(a==2011)
	{
		return sum;
	}
	else if(a<2011)
	{
		for(i=a+1;i<2011;i++)
		    sum+=leap(i);
		return sum;
	}
	else if(a>2011)
	{
		for(i=2012;i<a;i++)
		    sum+=leap(i);
		return sum;
	}
}
int yue(int a,int b,int c,int d)
{
	int i,j;
	int sum=0;
	for(i=b+1;i<13;i++)
	    sum+=day(a,i);
	for(i=1;i<d;i++)
	    sum+=day(c,i);
	return sum;
}
int answer(int a)
{
	if(a==5)
	    return 5;
	else if(a==6||a==-1)
	    return 6;
	else if(a==7||a==0)
	    return 7;
	else if(a==8||a==1)
	    return 1;
	else if(a==9||a==2)
	    return 2;
	else if(a==10||a==3)
	    return 3;
	else if(a==11||a==4)
	    return 4;
}
int main()
{
	int a,b,c;
	int sum;
	int chaa,chab,chac;
	int i,j,k;
	while(scanf("%d%d%d",&a,&b,&c)!=EOF)
	{
		sum=0;
		sum+=nian(a);
		if(a<2011)
		{
		    sum+=yue(a,b,2011,11);
		    sum+=(day(a,b)-c+11);
		}
		else if(a>2011)
		{
		    sum+=yue(2011,11,a,b);
		    sum+=(day(2011,11)-11+c);
		}
		else
		{
		    sum+=yue(2011,12,2011,11);
		    sum+=11;
		}
		sum%=7;
		if(a>2011)
		    sum+=5;
		else if(a<2011)
		    sum=5-sum;
		else
		{
			if(b<11)
			    sum=5-sum;
			else if(b>11)
			    sum+=5;
			else
			{
				if(c>11)
				    sum+=5;
				else if(c<11)
				    sum=5-sum;
				else
				    sum=5;
			}
		}
		printf("%d\n",answer(sum));
	}
	return 0;
}
时间: 2024-10-23 12:16:29

1502131514-蓝桥杯-算法提高 日期计算的相关文章

蓝桥杯-算法提高-日期计算

算法提高 日期计算 时间限制:1.0s   内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 输入只有一行 YYYY MM DD 输出格式 输出只有一行 W 数据规模和约定 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1 <= W &

蓝桥杯 算法提高 6-17 复数四则运算

算法提高 6-17复数四则运算 时间限制:1.0s   内存限制:512.0MB 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符分隔:输出时按a+bi的格式在屏幕上打印结果.参加样例输入和样例输出. 注意考虑特殊情况,无法计算时输出字符串"error". 样例输入 2 4 * -3 2 样例输出 -14-8i 样例输入 3 -2 + -1 3 样例输出 2+1i 1 #include<iostream> 2 #inc

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

蓝桥杯 算法提高 学霸的迷宫 经典BFS问题

算法提高 学霸的迷宫 时间限制:1.0s   内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线.可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线. 输入格式 第一行两个整数n, m,为迷宫的长宽. 接下来n行,每行m个数,数之间没

蓝桥杯——算法提高 最小方差生成树

一.思路 枚举所有生成树的边权和值,对每一个枚举的边权和值sum,修改所有边的边权为(es[i].cost - sum * 1.0 / (N - 1))2,即方差公式的分子,然后跑最小生成树算法,同时记录边的原来的权值和,如果求出的“最小方差”生成树的边权值和为sum,那么,用这个"最小方差"去更新答案. 二.复杂度分析 时间复杂度:O(N * W * M * logM).N * W为枚举边权和值的时间.边权和值最小为0,最大为(N - 1) * W. 三.PS 这题据说蓝桥杯官网数据

蓝桥杯 算法提高 道路和航路 满分AC ,SPFA算法的SLF优化,测试数据还是比较水的,貌似没有重边

算法提高 道路和航路 时间限制:1.0s   内存限制:256.0MB 问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连. 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci.每一条公路,Ci的范围为0<=Ci<=10,000:由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000

蓝桥杯- 算法提高 逆序排列

算法提高 逆序排列 时间限制:1.0s   内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存放,并打印出来.例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的值按逆序重新存放,即变成了2 6 -5 19 7,然后把它们打印出来. 输入格式:输入只有一行,由若干个整数组成,

蓝桥杯- 算法提高 最大乘积

算法提高 最大乘积 时间限制:1.0s   内存限制:512.0MB 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15, 第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4. 输出格式 每组数据输出1行,为最大的乘积. 样例输入 15 51 2 3 4 2 样例输出 48 #include<iostream&

算法提高 日期计算

题目描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入描述 输入只有一行 YYYY MM DD 输出描述 输出只有一行 W 输入样例 1599 1 1 输出样例 5 分析 基姆拉尔森计算公式: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 (需要使用switch...case语句判断星期几) 改进: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/