ZOJ-3939 The Lucky Week
ZOJ-3939 The Lucky Week
思路:读完题发现数据量好大,没法纯粹用日期增加来模拟,就想到一年内满足要求的日期个数是否有规律,所以打表,判断某个日期是星期几可以用公式来进行(感谢能带模板,不然公式死都记不住),第一次打出1753之后的2000年,暴力跑出循环长度是400,之后再打出更长的数据,发现循环长度就是400。于是开始敲代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define mod 998244353
#define eps 1e-6
double pi=acos(-1);
const ll INF=1e12;
int CaculateWeekDay(int y,int m, int d)
{//判断y-m-d是星期几,0-6,星期一-星期天 if(m==1||m==2) {m+=12;y--; } int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+7)%7;return week;
}
int CaculateYears(int y){
//打表出这一年的满足要求的日期的数量 int i,j,ans=0;for(i=1;i<13;i++){for(j=1;j<31;j+=10){if(CaculateWeekDay(y,i,j)==0){ans++;}}}return ans;
}
int CaculateThisYears(int y,int m,int d,int n){
//1.用于计算输入y-m-d开始到y这年结束有几个满足要求的数量
//2.计算并输出答案
//懒得分开写,凑合着看看就好int i,j,ans=0;for(j=d;j<31;j+=10){if(CaculateWeekDay(y,m,j)==0){ans++;if(ans==n){printf("%d %d %d\n",y,m,j);return 0;}}}for(i=m+1;i<13;i++){for(j=1;j<31;j+=10){if(CaculateWeekDay(y,i,j)==0){ans++;if(ans==n){printf("%d %d %d\n",y,i,j);return 0;}}}}return ans;
}
int main()
{int ans[400],sum[400];//打表记录int T,y,m,d,n,i,j;for(i=0;i<400;i++){ans[i]=CaculateYears(i+1753);if(i==0){sum[0]=ans[0];}else{sum[i]=sum[i-1]+ans[i];}}scanf("%d",&T);while(T--){scanf("%d%d%d%d",&y,&m,&d,&n);int ans1=CaculateThisYears(y,m,d,n);//如果返回0说明已经找到,结束if(ans1){n-=ans1;//去掉输入日期并在同一年的数量y+=n/sum[399]*400;n%=sum[399];if(n==0){//说明答案在y这年ans1=CaculateThisYears(y,1,1,ans[(y-1753)%400]);continue;}y++;//在之后年份中while(n>ans[(y-1753)%400]){//多与这一年的总数量,跑到下一年n-=ans[(y-1753)%400];y++;}ans1=CaculateThisYears(y,1,1,n);}}return 0;
}
ZOJ-3939 The Lucky Week相关推荐
- ZOJ - 3939 The Lucky Week【简单方法】
题目 传送门 Sample Input 2 2016 4 11 2 2016 1 11 10 Sample Output 2016 7 11 2017 9 11 题意:t组数据,给出四个数,x,y,z ...
- 【打表找循环节】ZOJ - 3939 The Lucky Week
Step1 Problem: 幸运日指,星期一是1 or 11 or 21号.给出第一个幸运日时间,问第n个幸运日的时间. 例如: 2016 4 11 2 输出: 2016 7 11 数据范围: 时间 ...
- ZOJ 3939 The Lucky Week (打表预处理/找规律)
题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115189#problem/C 代码: #include <cstdio> ...
- The 13th Zhejiang Provincial Collegiate Contest(2016年浙江省赛)
前4道水题就不说了,其中我做了C题,1Y,小心仔细写代码并且提交之前得确认无误后提交才能减少出错率. 结果后面2题都由波神做掉,学长带我们飞~ 终榜 官方题解 ZOJ 3946 Highway ...
- 信息学竞赛中的数学知识 --- 容斥原理
C++基础数论-----容斥原理 C++基础数论-----容斥原理_C2020lax的博客-CSDN博客_容斥原理c++ C++数论容斥原理----无关的元素 C++数论容斥原理----无关的元素 - ...
- POJ ZOJ题目分类
POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...
- POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)
水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法: (1)枚举 (1753,2965) (2)贪心(13 ...
- NOIP 好题推荐(DP+搜索+图论)POJ ZOJ
NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS) 1090 Chain ->格雷码和二进制码 ...
- ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!
两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...
- hihocoder 1152 Lucky Substrings
#1152 : Lucky Substrings 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if t ...
最新文章
- HDU2024 C语言合法标识符
- python中缩进规则的例外
- android jni ——Field Method -- Accessing Field
- 用代码证明自己闲的蛋疼(一)——cmd闪瞎狗眼
- django-分页的演示
- 2万 | 北京做Java开发月薪 2 万,so easy!
- JDBC操作(基础篇)
- Win32 Thread Information Block
- [Sdoi2013] 直径
- sqlserver导出表结构到excel
- 独孤求败-小滴云架构大课十八式
- WISP、Client+AP和WDS 区别
- python 对称加密_常见加密方式及Python实现
- [转]一个人生活,如何摆脱孤独提升幸福感?
- 基于Trie树进行拆分字符串变成拼音音节(二):字符串拼音拆分
- 云计算的特点与产生、云计算体系结构、新摩尔定律、云计算优势
- 拼音首字母缩写在线翻译源码
- Linux时间一直跳回原始时间,Linux时间同步
- DELL PC服务器PowerEdge 管理工具OMSA的使用
- VGG16-好莱坞明星识别
热门文章
- shell检查Android设备连接状态
- 超大背包(挑战编程之01背包)
- 【Java例题】3.6	计算arcsin(x)的值
- 什么是平台即服务 (PaaS)?定义、示例、组件和最佳实践
- windows10卸载程序_如何在Windows 10中卸载或修复程序
- The simplest way to combine two csv file in python
- java计算机毕业设计学生成绩管理系统源程序+mysql+系统+lw文档+远程调试
- Coolpad(酷派) 进入手机工厂模式
- java 超时状态_Java任务超时处理机制实现【原创】
- 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)