目录

题目

思路解析

代码实现


题目

思路解析

按照这个题的思路,我们不妨做一个2007年的日历

然后根据题目要求,排出扫地的人

Mon Tue Wed Thu Fri Sat Sun
9月 1(B) 2(X)
3(ALL) 4(H) 5(P) 6(B) 7(X) 8(H) 9(P)
10(ALL) 11(B) 12(X) 13(H) 14(P) 15(B) 16(X)
17(ALL) 18(H) 19(P) 20(B) 21(X) 22(H) 23(P)
24(ALL) 25(B) 26(X) 27(H) 28(P) 29(B) 30(X)
10月 1(ALL) 2(H) 3(P) 4(B) 5(X) 6(H) 7(P)
8(ALL) 9(B) 10(X) 11(H) 12(P) 13 14
15(ALL) 16 17 18 19 20 21
22 23 24 25 26 27

28

29 30 31
11月 1 2 3 4

想必根据表格,已经找出规律了吧,也就是14天一个轮回。 因此,愉快的开始打表生活

//c++ 代码
string name[14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//打表输入人
//c语言代码
char name[][14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//打表输入人 

由于是14天一个轮回,因此我们可以求出总天数,然后mod14。

然而,每个月的日期又不一样,因此又开始愉快的打表生活

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//打表输入月份 

假设目标日期为2007年10月20日,通过口算是49天,然后我们很容易想出暴力解法。

int year=2007,month=10,day=20;
int sum=0;
for(int i=9;i<=month;i++){sum+=Month[i];
}
sum+=365*(year-2007);
sum+=day-1;

但是如果是2008年呢?2009年呢?(因为i初始为9,如果求的是4月,这样的代码就不行)然后又要去if  else特判,这样未免显得有点复杂。

因此我们不妨做一个处理,把每个月份的第一天到年末的天数算出来。

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};
int sum=0,month=10,day=20;
//后缀求和,这样Month[i]就表示到年末的天数了for(int i=12;i>=1;i--){Month[i]+=Month[i+1];}
//然后与9月1日的天数差就可以这样表示sum=Month[9]-Month[month]+day-1;

看到这里,想必大家会有点蒙。

由于我们做了后缀和处理,实际上现在的Month[9]==30+31+30+31=122,也就是9月1日到年末12月31日的天数了,由于假设的month=10,所以Month[10]=31+30+31=92,也就是10月1日到年末的天数啦。两式相减就是刚好30天,也就是9月的天数,然后我们再加上day的天数-1(减去9月1日)就是总天数49天啦。

然后大家想必还会觉得我这样多此一举,那不妨我们再举个例,2008年2月10日。

还是通过口算得知为162天

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};
int sum=0,year=2008,month=2,day=10;
//后缀求和,这样Month[i]就表示到年末的天数了for(int i=12;i>=1;i--){Month[i]+=Month[i+1];}
//然后与9月1日的天数差就可以这样表示sum=Month[9]-Month[month]+day-1;sum+=365*(year-2007);

由于后缀和处理,现在的Month[2]即为334了,也就是2月1日到12月31日的天数啦。

带入式子计算sum=365+122-334+10-1=162。计算结果完美符合推测。

综上所述,求和代码即:

sum=365*(year-2007)-Month[month]+Month[9]+day-1;

但是呢,别以为这就完了,题目还有个坑,也就是2008年为闰年!!!2月有29天呢。

通过之前的求和,得知2007年9月1日到2008年2月28日刚好是180天。

因此,当sum>180时,我们让sum++。细心的同学已经发现,这样不就没181了吗?

没错,181即为2月29日,因此我们单独列出来就行。

if(sum>180) sum++;
if(year==2008&&month==2&&day==29) sum=181;

好了,费了这么久的求和总算求完了,接下来就是输出了。

由于之前的规律,我们清楚14天一个轮回,所以只需sum%14就行,也就是输出name[sum%14]。

最后再将以上散装代码组合即可。

代码实现

c语言

#include<bits/stdc++.h>
int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//打表输入月份
char name[][14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//打表输入人
int main()
{//输入年月日 int year,month,day,sum;scanf("%d %d %d",&year,&month,&day);//后缀和 for(int i=12;i>=1;i--){Month[i]+=Month[i+1];}//计算总天数sum=365*(year-2007)-Month[month]+Month[9]+day-1;if(sum>180) sum++;if(year==2008&&month==2&&day==29) sum=181;//输出printf("%s\n",name[sum%14]);return 0;
}

C++

#include<bits/stdc++.h>
using namespace std;
int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//打表输入月份
string name[14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//打表输入人
int main()
{//输入年月日 int year,month,day,sum;cin>>year>>month>>day;//后缀和 for(int i=12;i>=1;i--){Month[i]+=Month[i+1];}//计算总天数sum=365*(year-2007)-Month[month]+Month[9]+day-1;if(sum>180) sum++;if(year==2008&&month==2&&day==29) sum=181;//输出 cout<<name[sum%14]<<endl;return 0;
}

swust oj 题解#509 寝室扫地问题相关推荐

  1. 509 寝室扫地问题

    509 寝室扫地问题 题目描述 东六-B104寝室四人经常记不住该谁扫地,他们是这样安排的:从2007年9月1号(星期六)起,每天按床号循环扫地,但是星期一除外,因为每个星期一都要检查卫生,他们决定星 ...

  2. SWUSTOJ #509 寝室扫地问题

    SWUSTOJ #509 寝室扫地问题 题目 输入 输出 样例输入 样例输出 源代码 题目 东六-B104寝室四人经常记不住该谁扫地,他们是这样安排的:从2007年9月1号(星期六)起,每天按床号循环 ...

  3. SWUST OJ#978 #979 #980 二叉树的遍历

    目录 深度优先遍历 输出利用先序遍历创建的二叉树的前序遍历序列 思路 代码 #978 输出利用先序遍历创建的二叉树的中序遍历序列 题目 思路 代码 #979 输出利用先序遍历创建的二叉树的后序遍历序列 ...

  4. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Descr ...

  5. SWUST OJ 954单链表的链接

    swust oj 954 题目描述 建立长度为n的单链表A和长度为m的单链表B.编程实现将B表链接在A表的尾端,形成一个单链表A.数据类型指定为字符型. 输入 输出 样例输入 样例输出 源代码 #in ...

  6. swust oj#160促销计算

    SWUST OJ#160 题目描述 某百货公司为了促销,采用购物打折的优惠方法,每位顾客一次购物:在1000元以上者,按9.5折优惠:在2000以上者,按9折优惠:在3000以上者,按8.5折优惠:在 ...

  7. SWUST OJ 1168 喝可乐

    swust oj 1168 题目描述 小明十分喜欢喝可乐,有一次店家搞促销,用三个可乐瓶盖便可换一瓶新可乐.现在告诉你小明身上的钱和 每瓶可乐的单价,问你小明最多可以喝多少瓶可乐?(不能向老板借瓶盖) ...

  8. swust oj代码+解析_1165,0284,0074,0042,1171,0026,0189,0078,0046,0077,0209,0129

    swust oj 1165,0284(int a[n]\数字根),0074,0042,1171(矩阵相乘 输出对齐),0026/0189,0078(计算生日是星期几),0046,0077(计算员工周工 ...

  9. SWUST OJ#281逃跑的蠕虫

    swust oj 281 题目描述 装在瓶子(瓶子高度为h)的蠕虫都想从瓶子底部向瓶口处爬出去.它每分钟向上爬行u厘米,之后会休息一分钟,这一分钟它会向下滑行d厘米,当蠕虫到了瓶口或者超出瓶口后便出了 ...

最新文章

  1. 太酷啦!我在A4纸上看宫崎骏动画
  2. 高一数学集合知识点整理_高一 | 数学 “集合”知识点总结及归纳~
  3. 机器学习降维-深度AI科普团队
  4. white-space、over-flow、text-overflow
  5. CSS 的复合选择器
  6. 【真正离线安装】Adobe Flash Player 32.0 插件离线安装包下载(无需联网安装)
  7. Android获取安装应用Apk包大小 缓存大小 getPackageSizeInfo StorageManager
  8. vs2008 sp1补丁安装到最后一点点的时候,就无法安装下去了 解决方法[转]
  9. 和cesuim类似的三维GIS平台_绿城南宁,火红的三维GIS
  10. 极品五笔输入法2009_考场指南!2020年注会机考计算器使用指南及输入法切换
  11. SpringBoot第二特性:Starter启动依赖_01_自己动手写一个Starter组件
  12. MathType中/英文版下载地址汇总(适用于Mathtype6.9)
  13. Zoom天使投资人Jim Scheinman:Zoom的诞生始末
  14. 【Popper报错】Popper: modifier “undefined“ provided an invalid “fn“ property
  15. oracle从序列中查最大id,Oracle序列详解
  16. 【Vue.js 3.0源码】KeepAlive 组件:如何让组件在内存中缓存和调度?
  17. 2.Select操作
  18. nodejs能否替代java_nodejs能代替java吗?
  19. wifi 信号差 android,手机WiFi信号弱怎么办 手机WiFi信号突然变弱的解决方法
  20. 有没有好看的俄剧推荐-如下表

热门文章

  1. R语言中的遗传算法详细解析
  2. Linux用户与用户组管理
  3. 谭浩强c语言第7章14题,谭浩强C语言课件第7章.ppt
  4. 2018年5月软考网络工程师上午真题知识点总结
  5. python线程池抓取网页数据
  6. org.xml.sax.SAXException: Invalid element
  7. PIC OTP 单片机程序烧写方法
  8. php的应用程序开发,创建应用程序
  9. squashfs for windows:windows下的squ打包工具
  10. vue2项目中如何接入视频监控