目录

题目

思路解析

代码实现


题目

思路解析

按照这个题的思路,我们不妨做一个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. react 树形菜单_关于React 使用antd组件递归实现左侧菜单导航树(MenusTree)的示例...
  2. java-web分层2-Bean和业务层
  3. 命令行下操作常用语句
  4. HyperLink 鼠标经过时候显示全部文字
  5. 拟真机器人拯救者奖励_冒险岛新版本拟真机器人什么样 新版本攻略
  6. mysql数据库 常用函数_《MySQL数据库》常用函数整理
  7. Maven学习笔记(2) --mvn archetype:create 说明
  8. 在Payara Server和GlassFish中配置密码
  9. [Github推荐]CVPR2019录用论文下载及可视化论文网站
  10. 中医移动医疗_中医之极简移动医疗
  11. 分布式设计 —— 容错与主备
  12. swift. 扩展类添加属性_swift 扩展属性的方法
  13. Linux快捷键详解
  14. OpenAI 最强对话模型 ChatGPT 注册使用笔记
  15. uniapp打包app教程
  16. Django写一个登录注册---001创建项目以及设计数据库
  17. qt报错:In included file: expected member name or ‘;‘ after declaration specifiers
  18. 项目 调度 服务器,(2)项目构建(Reactor部分)【Lars-基于C++负载均衡远程服务器调度系统教程】...
  19. kpw4换壁纸_Kindle Paperwhite 原生系统如何更换屏保图片?
  20. 双非硕士的辛酸求职回忆录:第 1 篇 一份让面试官满意的简历究竟要做到什么

热门文章

  1. 防守者的角度来看攻击
  2. linux购物系统源码,2021.4月LooShop购物商城网站PHP源码运营打包版 PC+手机+微信三站合一 带支付宝微信等第三方在线支付功能...
  3. initrdinit进程
  4. API经济时代,SWIFT推动银行业API接口标准化
  5. 为专业电竞而生:努比亚红魔战地迷彩版空降ChinaJoy
  6. 【uniapp】实现对TXT文本文件的读取和保存下载
  7. 计算机l特键,高逼格的三大电脑快捷键,快如闪电!
  8. 在Linux下编程和在Windows下编程的区别
  9. IIS 配置好了,网站打开一片空白
  10. [转]SCI,EI,ISTP,SSCI,INSPEC,SCIE,IEEE,CSCD,CSSCI