USACO Section1.1 Friday the Thirteenth 解题报告

    friday解题报告 —— icedream61 博客园(转载请注明出处)

------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  据说曾经的黑色星期五是13号?本题让我们看看13号与星期五是否比与别的日子更有缘。
  给出正整数n,请告诉我在“1900年1月1日”到“1900+n-1年12月31日”中,星期一到星期天各自有多少个13号。
  注意,输出时,顺序是周六、周日、周一、周二、周三、周四、周五,一共7个数,空格隔开。
【数据范围】
  n<=400
【输入样例】
  20
【输出样例】
  36 33 34 33 35 35 34
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  做法很简单,每个月都有13号,所以枚举所有的月份就好了。过程中判断一下平年闰年,保证每月日子别算错就好。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  这题写完交上去WA,一看发现输出要求是周六放在第一个……
  改完交上去又WA,这次怎么也找不出错来,结果要来了DYZ的AC代码,发现自己change函数三个return没写进if的大括号里,手生啊!
  吐槽:我的代码中有对n==0的特判,是因为我被USACO Translate上的翻译坑了……原题中n是正整数,被翻译成了非负数,我也是醉了……

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

复制代码
 1 /*
 2 ID: icedrea1
 3 PROG: friday
 4 LANG: C++
 5 */
 6 
 7 #include <iostream>
 8 #include <fstream>
 9 using namespace std;
10 
11 int add[1+12]={ 0,31,28,31,30,31,30,31,31,30,31,30,31 };
12 
13 ifstream in("friday.in");
14 ofstream out("friday.out");
15 
16 int n,r[7];
17 
18 void change(int y)
19 {
20     if(y%400==0) { add[2]=29; return; }
21     if(y%100==0) { add[2]=28; return; }
22     if(y%4==0) { add[2]=29; return; }
23     add[2]=28;
24 }
25 void work()
26 {
27     cout<<"in work"<<endl;
28     int state=6;
29     for(int y=1900;y<=1900+n-1;++y)
30     {
31         change(y); cout<<"y="<<y<<"\tday="<<add[2]<<endl;
32         for(int m=1;m<=12;++m)
33         {
34             ++r[state]; //cout<<"m="<<m<<"\tstate="<<state;
35             state=(state+add[m])%7; //cout<<"\tadd="<<add[m]<<endl;
36         }
37     }
38     out<<r[6]<<' '<<r[0]<<' '<<r[1]<<' '<<r[2]<<' '<<r[3]<<' '<<r[4]<<' '<<r[5]<<endl;
39 }
40 
41 int main()
42 {
43     in>>n;
44     if(n==0) { out<<"0 0 0 0 0 0 0"<<endl; } else work();
45     in.close(); out.close();
46     return 0;
47 }
复制代码

 

posted on   IceDream61  阅读(600)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示