现在的位置: 首页 > 综合 > 正文

USACO 1.1 Problem 3

2017年11月21日 ⁄ 综合 ⁄ 共 883字 ⁄ 字号 评论关闭

题目描述:

题目还是很好懂的,因为就是算一个循环的年份,然后计算每一个月的13号是星期几,然后记下来,最后输出每个星期几出现了几次。顺序是周六,周日...周四,周五这样的。

算法思想:

这道题还是考实现吧,因为根本没有什么算法的思想在内,只是考自己的代码能否把自己心中的想法表达出来。

关于代码的描述大概就是把每一个月的天数记下来,注意在循环的时候判断是不是闰年然后相对应的改2月的数值。然后提前算出1900年1月13号是周六。最后根据模运算来确定一个月后的13号是周几。关于这个模运算,就是说如果31 mod 7 = 4,那么一个31天的月份过去后,当前的星期就加上4。

代码部分:

#include <fstream>
#include <iostream>
using namespace std;

int result[8];
int day[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

bool is_leap(int y) {
	if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 1;
	else return 0;
}

int main() {
	ifstream fin("friday.in");
	ofstream fout("friday.out");
	result[6] ++;
	int n;
	fin >> n;
	int pre = 6;
	for (int i = 1; i <= n; i++) {
		if (is_leap(1900 + i - 1)) day[2] = 29;
		for (int j = 1; j <= 12; j++) {
			if (i == 1 && j == 1) continue;
			int temp = (j == 1) ? j - 1 + 12 : j - 1;
			int cur = pre + day[temp] % 7;
			while (cur > 7) cur -= 7;
			result[cur]++;
			pre = cur;
		}
		day[2] = 28;
	}

	for (int i = 6; i < 13; i++) {
		if (i == 12) {
			fout << result[i - 7] << endl;
			break;
		}
		if (i > 7) fout << result[i - 7] << " ";
		else fout << result[i] << " ";
	}

抱歉!评论已关闭.